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

文章目录