假设交换文件中的每两行,直到只剩下一行或所有行都用完。我不想在这样做时使用另一个文件。
这是我的代码:
#include <stdio.h>
int main() {
FILE *fp = fopen("this.txt", "r+");
int i = 0;
char line1[100], line2[100];
fpos_t pos;
fgetpos(fp, &pos);
//to get the total line count
while (!feof(fp)) {
fgets(line1, 100, fp);
i++;
}
i /= 2; //no. of times to run the loop
rewind(fp);
while (i-- > 0) { //trying to use !feof(fp) condition to break the loop results in an infinite loop
fgets(line1, 100, fp);
fgets(line2, 100, fp);
fsetpos(fp, &pos);
fputs(line2, fp);
fputs(line1, fp);
fgetpos(fp, &pos);
}
fclose(fp);
return 0;
}
this.txt 中的内容:
aaa
b
cc
ddd
ee
ffff
gg
hhhh
i
jj
运行程序后的内容
b
aaa
ddd
cc
ddd
c
c
c
i
jj
我什至尝试使用fseek
代替fgetpos
来获得相同的错误结果。
据我所知,在第二个 while 循环运行了两次之后(即前四行已被处理),光标正确地位于它应该在的第 17 个字节(由调用返回ftell(fp)
)甚至文件第 4 行之后的内容不变,并且由于某种原因,fgets
当循环第三次运行时被调用时,读入数组 line1 和 line2 的内容分别为“c\n”和“ddd\n”。
再次,我不想使用另一个文件来完成这个,我只需要弄清楚屏幕后面到底出了什么问题
任何线索将不胜感激。谢谢你。