c 文件操作
1 找到文件最后一个字符的位置
fseek(fp, -1, SEEK_END);
2 找到文件最后一个字符后边的非法位置
fseek(fp, 0, SEEK_END);
3 文件的开始位置是0
void test5()
{
string filePath = "D:/code/c/find_last_line/data.txt";
FILE *fp = fopen(filePath.c_str(), "r");
printf("%d\n", ftell(fp));
printf("%d\n", feof(fp));
fclose(fp);
}
结果
0
0
4 feof() 这个函数只有在非法位置读取内容了之后生效,返回非零值
文件指针站在非法位置,但是只要不读取,就不会返回非零值。
data.txt:(我是改成了LF结尾,就是unix的只有\n作为换行符,不是windows的\r\n)
1
a
!@#$
void test4()
{
string filePath = "D:/code/c/find_last_line/data.txt";
FILE *fp = fopen(filePath.c_str(), "r");
fseek(fp, 0, SEEK_END);
printf("%d\n", ftell(fp));
printf("%d\n", feof(fp));
printf("%c\n", fgetc(fp));
printf("%d\n", feof(fp));
fclose(fp);
}
测试结果:
8
0
16
可以看到文件一共8个字符(两个回车符),打印出来了当前的位置8,文件的开始位置是0.也就是当前文件指针指向的是第9个字符的位置,这个位置已经越界了,是非法位置。但是此时feof并没有报错。
void test6()
{
string filePath = "D:/code/c/find_last_line/data.txt";
FILE *fp = fopen(filePath.c_str(), "r");
fseek(fp, 10, SEEK_END);
printf("%d\n", ftell(fp));
printf("%d\n", feof(fp));
fclose(fp);
}
测试结果:
18
0
更过分一点,文件总共8个字符,但是偏移到第19个字符去了,只要不读取,feof也不会报错。
所以如果想要使用feof来判断是否读取完毕,必须先读取,再判断,如果判断成功,那么那个读取的数据就是非法的不能用的。
fgets();// 拿出来先不要用,先得判断
while(feof)
{
usedata();
fgets();
}
// 这里就不用继续处理最后一次的data了,因为最后一次是错误的,非法的。
5 常用函数
打开关闭文件
fopen
fclose
字符串读写
fgets
fputs
格式话读写
fscanf
fprintf
读写一个字符
fgetc
fputc
二进制读写
fwrite
fread
读取一行
getline