一个文件要有?个唯?的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径+文件名主干+文件后缀
例如: c:\code\test.txt
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符?个字节),而以二进制形式输出,则在磁盘上只占4个字节(VS2019测试)。
FILE*pf;//文件指针变量
定义pf是?个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是?个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够间接找到与它关联的文件。
比如:
//打开文件
FILE* fopen(const char* filename, const char * mode);
//filename是文件名,mode是打开方式
//关闭文件
int flose(FILE * stream);
mode是文件的打开模式,下面都是文件的打开模式:
文件使用方式 | 含义 | 如果指定文件不存在 |
“r”(只读) | 为了输入一个数据,打开一个已经存在的文本文件 | 出错 |
“w”(只写) | 为了输入一个数据,打开一个文本文件 | 建立一个新的文本文件 |
“a”(追加) | 想文本文件末尾添加数据 | 建立一个新文件 |
“rb”(只读) | 为了输入数据,打开一个二进制文件 | 出错 |
“wb”(只写) | 为了输出数据,打开一个二进制文件 | 建立一个新文件 |
“ab”(追加) | 向一个二进制文件尾添加数据 | 建立一个新文件 |
“r+”(读写) | 为了读和写打开一个文本文件 | 出错 |
“w+”(读写) | 为了读和写建立一个新的文件 | 建立一个新文件 |
“a+”(读写) | 打开一个文件在文件尾进行读写 | 建立一个新文件 |
“rb+”(读写) | 为了读和写打开一个二进制文件 | 出错 |
“wb+”(读写) | 为了读和写,建立一个新的二进制文件 | 建立一个新的文件 |
“ab+”(读写) | 打开一个二进制文件,在文件尾进行读和写 | 建立一个新的文件 |
函数名 | 功能 | 适用于 |
fgetc | 字符输入函数(读) | 所有输入流(stdin,文件输入流……) |
fputc | 字符输出函数(写) | 所有输出流 |
fgets | 文本行输入函数 | 所有输入流 |
fputs | 文本行输出流 | 所有输出流 |
fscanf | 格式化输入函数 | 所有输入流 |
fprintf | 格式化输出函数 | 所有输出流 |
fread | 二进制输入 | 文本 |
fwrite | 二进制输出 | 文本 |
使用样例:
//fputc
int fputc(int character,FILE*stream);
//fgetc
int fgetc(FILE*stream);
//fgets
char *fgets(char* str,int num,FILE* stream);
//fputs
char * fputs(const cahr*str,FILE* stream);
//str指的是字符串
//num指最多读num-1个,最后一个是'\0'
//fscanf
int fscanf (FILE* stream, const char* format……)
//fprintf
int fprintf(FILE*stream, const char* format……)
//fwrite
size_t fwrite (const void*ptr , size_t size, size_t cont ,FILE*stream);
// 指针指向的位置的地址 元素字节大小 元素个数
//fread
fread参数与fwrite一样
应用:写一个代码,完成将date1.txt的文件内容拷贝生成date4.txt的文件
#include<stdio.h>
#include <stdlib.h>
int main()
{
FILE* pf=fopen("date1.txt", "r");
if (pf == NULL)
{
perror("fopen->date1");
return 1;
}
FILE* p = fopen("date4.txt", "w");
if (p == NULL)
{
perror("fopen->date4.txt");
fclose(pf);
pf = NULL;
return 1;
}
//数据读写,拷贝
char ch = 0;
while ((ch == fgetc(pf))!= EOF)
{
fputc(ch, p);
}
fclose(pf);
fclose(p);
pf = NULL;
p = NULL;
}
scanf/printf
scanf:针对标准输入(键盘)的格式化输入函数
printf:针对标准输出的格式化输出函数
fscanf/fprintf
fscanf:针对所有输入流(标准流,文件流)的格式化输入函数
fprintf:针对所有输出流的格式化输出函数
sscanf/ ssprintf
sscanf:在字符串读格式化数据
sspritnf:把格式化数据转为字符串
随机:自己指定在哪里读和写
int fseek(FILE*stream, long int offset, int origin)
// 偏移量 起始位置
long int ftell(FILE* stream)
int main()
{
FILE* pFile;
long size;
pFile = fopen("example.txt", "rb");
if (pFile == NULL)
{
perror("fopen");
return 1;
}
else
{
fseek(pFile, 0, SEEK_SET);
size = ftell(pFile);
fclose(pFile);
printf("Size of example.txt :%ld bytes.\n", size);
}
return 0;
void rewind(FILE * stream)
int main()
{
int n;
FILE* pf;
char buffer[27];
pf = fopen("example.txt", "w+");
for (n = 'A'; n <= 'Z'; n++)
{
fputc(n, pf);
}
rewind(pf);
fread(buffer, 1, 26, pf);
fclose(pf);
buffer[26] = '\0';
printf(buffer);
return 0;
}
#include <stdio.h>
#include <windows.h>
int main()
{
FILE* pf = fopen("test.txt", "w");
fputs("abcdef", pf);//先将代码放在输出缓冲区
printf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容\n");
Sleep(10000);
printf("刷新缓冲区\n");
fflush(pf);//刷新缓冲时才把缓冲区的内容写到文件(磁盘)
printf("再睡眠10秒-此时打开文件test.txt,文件有内容了\n");
Sleep(10000);
fclose(pf);
pf = NULL;
return 0;
}
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。