1.文件的打开与关闭
使用fopen函数打开文件,fclose关闭文件。
int main()
{
//打开文件
FILE* pf = fopen("test.dat", "r");
if(pf == NULL)
{
perror("fopen");
return 1;
}
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
打开方式如下:
文件使用方式 | 含义 | 如果指定文件不存在 |
"r"(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
"w"(只写) | 为了输出数据,打开一个文本文件 | 建立一个新的文件 |
"a"(追加) | 向文本文件尾添加数据 | 建立一个新的文件 |
"rb"(只读) | 为了输入数据,打开一个二进制文件 | 出错 |
"wb"(只写) | 为了输出数据,打开一个二进制文件 | 建立一个新的文件 |
"ab"(追加) | 向一个二进制文件尾添加数据 | 出错 |
"r+"(读写) | 为了读和写,打开一个文本文件 | 出错 |
"w+"(读写) | 为了读和写,建立一个文本文件 | 建立一个新的文件 |
"a+"(读写) | 打开一个文件,在文件尾进行读写 | 建立一个新的文件 |
"rb+"(读写) | 为了读和写,打开一个二进制文件 | 出错 |
"wb+"(读写) | 为了读和写,新建一个新的二进制文件 | 建立一个新的文件 |
"ab+"(读写) | 打开一个二进制文件,在文件尾进行读和写 | 建立一个新的文件 |
2.文件的顺序读写
功能 | 函数名 | 适用于 |
字符输入函数 | fgetc | 所有输入流 |
字符输出函数 | fputc | 所有输出流 |
文本行输入函数 | fgets | 所有输入流 |
文本行输出函数 | fputs | 所有输出流 |
格式化输入函数 | fscanf | 所有输入流 |
格式化输出函数 | fprintf | 所有输出流 |
二进制输入 | fread | 文件 |
二进制输出 | fwrite | 文件 |
2.1 fgetc和fputc函数
2.2 fgets和fputs函数
2.3 fscanf和fprintf函数
2.4 fread和fwrite函数
3.对比一组函数
scanf 针对标准输入的格式化输入语句 - stdin
fscanf 针对所有输入流的格式化输入语句 - stdin/文件
sscanf 从一个字符串中读取一个格式化的数据
printf 针对标准输出的格式化输出语句 - stdout
fprintf 针对所有输出流的格式化输出语句 - stdout/文件
sprintf 把一个格式化的数据转换成字符串
4.文件的随机读写
4.1 fseek
根据文件指针的位置和偏移量来定位文件指针。
SEEK_CUR 文件指针的当前位置
SEEK_END 文件结束
SEEK_SET 文件开始
4.2 ftell
返回文件指针相对于起始位置的偏移量。
4.3 rewind
让文件指针的位置回到文件的起始位置。
int main()
{
FILE* pf = fopen("test.txt", "r");
//假设文件的内容为"abcdef"
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件
int ch = fgetc(pf);
printf("%c\n", ch);//a
//调整文件指针
fseek(pf, 2, SEEK_CUR);
ch = fgetc(pf);
printf("%c\n", ch);//d
ch = fgetc(pf);
printf("%c\n", ch);//e
int ret = ftell(pf);
printf("%d\n", ret);//5
//让文件指针回到起始位置
rewind(pf);
ch = fgetc(pf);
printf("%c\n", ch);//a
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
5. feof函数
在文件读取过程中,不能用feof函数的返回值直接用来判断文件的读取是否结束,而是应用于当文件读取结束时,判断是读取失败结束,还是遇到文件尾结束。
1.文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者NULL(fgets)。
2.二进制文件的读取结束判断,判断返回值是否小于实际要读取的个数(fread)。
fgetc函数在读取结束时会返回EOF,正常读取时,返回的是读取到的字符的ASCII码值。
fgets函数在读取结束时会返回NULL,正常读取时,返回存放字符空间的起始地址。
fread函数在读取时,返回的是实际读取到的完整元素的个数,如果发现读取到的完整元素的个数小于指定的元素个数,这就是最后一次读取了。
//写代码把test.txt文件拷贝一份,生成test2.txt
int main()
{
FILE* pfread = fopen("test.txt", "r");
if (pfread == NULL)
{
return 1;
}
FILE* pfwrite = fopen("test2.txt", "w");
if (pfwrite == NULL)
{
fclose(pfread);
pfread = NULL;
return 1;
}
//文件打开成功
//读写文件
int ch = 0;
while ((ch = fgetc(pfread)) != EOF)
{
//写文件
fputc(ch, pfwrite);
}
if (feof(pfread))
{
pritnf("遇到文件结束标志,文件正常结束\n");
}
else if (ferror(pfread))
{
printf("文件读取失败结束\n");
}
//关闭文件
fclose(pfread);
pfread = NULL;
fclose(pfwrite);
pfwrite = NULL;
return 0;
}