1、ferror文件读写错误
feof
语法:
#include <stdio.h> int feof( FILE *stream ); |
函数feof()在到达给出的文件流的文件尾时返回一个非零值.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
FILE* file;
file = fopen("E:\\C\\vscode\\C\\file_io\\user.txt", "r");
if (!file) {
puts("open fail.");
return -1;
}
char ret_char;
// while((ret_char=fgetc(file)) != EOF)//循环读到文件结束
// {
// putchar(ret_char);
// }
while (!feof(file))
{
// ret_char = fgetc(file);
// putchar(ret_char);
putchar(fgetc(file));
}
fclose(file);
}
user文件内容
nike adi
nike adidas
hello world
1、使用fgetc的返回值作为循环地判断,正常打印结果
while((ret_char=fgetc(file)) != EOF)//循环读到文件结束
{
putchar(ret_char);
}
2、使用feof
为什么使用feof,
比如fgetc读完返回EOF(-1)。
但是有的函数没有读完,失败时候返回-1,需要读取-1,(比如getw)使用feof更加方便和准确。
所以我们使用feof函数进行判断,结尾时候返回非零值。
while (!feof(file))//没读完一直读
{
// ret_char = fgetc(file);
// putchar(ret_char);
putchar(fgetc(file));
}
#发现错误:发现多打个一个字符
nike adi
nike adidas
hello world heheA
E:\C\visualStudio\demo\feof_io\x64\Debug\feof_io.exe (进程 10484)已退出,代码为 0。
按任意键关闭此窗口. . .
为什么会多打出一个字符,判断到A的时候,循环还在进行所以多读了一个字符
解决方法:提前读取获取开始的字符
ret_char = fgetc(file);
while (!feof(file))
{
//ret_char = fgetc(file);
// putchar(ret_char);
putchar(ret_char);
ret_char = fgetc(file);
}
nike adi
nike adidas
hello world heheA
E:\C\visualStudio\demo\feof_io\x64\Debug\feof_io.exe (进程 32320)已退出,代码为 0。
按任意键关闭此窗口. . .
结果没有问题
2、ferror文件读写错误
ferror
语法:
#include <stdio.h> int ferror( FILE *stream ); |
ferror()函数检查stream(流)中的错误, 如果没发生错误返回0,否则返回非零. 如果发生错误, 使用perror()检测发生什么错误.
#include <stdio.h>
int main()
{
FILE *file;
file = fopen("E:\\C\\vscode\\C\\file_io\\user.txt", "a");
if(!file){
puts("open fail.");
return -1;
}else{
puts("open sucess.");
}
int ret;
ret = fputc('A',file);
if(ret == EOF)
{
puts("fputc失败");
}
if(ferror(file))
{
perror("fputc");
}
fclose(file);
}
设置权限为r的时候,会写入失败
open sucess.
fputc失败
fputc: Bad file descriptor
PS E:\C>
当权限为a的时候,成功写入
使用ferror的时候可以返回失败的原因