【发布时间】:2017-06-22 03:28:44
【问题描述】:
假设在文件中每两行交换一次,直到只剩下一行或所有行都用完。我不想在这样做时使用另一个文件。
这是我的代码:
#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 循环运行了两次 (即前四行已被处理) 之后,光标正确地位于应该是 (由对ftell(fp) 的调用返回) 甚至第四行之后的文件内容都没有改变,并且由于某种原因,当循环第三次运行时调用fgets 时,内容读入数组 line1 和 line2 分别是 "c\n" 和 "ddd\n"。
再次,我不想使用其他文件来完成此操作,我只需要弄清楚屏幕后面到底出了什么问题
任何线索将不胜感激。谢谢你。
【问题讨论】:
-
fputs(line1,fp);-->fputs(line1,fp);fflush(fp); -
为什么不将文件加载到内存中,然后在换行时将其写回?或者如果这不可能,重命名文件并同时读写
-
@kaetzacoatl,将其加载到 ram 中是指将所有内容存储到一个大字符数组中,对吗?还是您在谈论其他可能性?一个大字符数组绝对是一种选择,但我只是想知道我的代码有什么问题。如果我只使用一个文件,同时重命名和读取和写入不会有任何区别,对吗?
-
@BLUEPIXY 是的,它现在可以工作了。但我不明白为什么有这种明确的需要 flush ?为什么它不会自动刷新,在什么情况下会?我刚刚阅读了另一个这样的问题,其中一个接受的答案是最后的换行符会自动刷新内容。但是他们在谈论标准输出流,这不适用于文件流吗?
-
如果缓冲区用于输出(在系统上),它取决于刷新时的实现。即使程序从内存中刷新,系统也可能正在缓冲它。
标签: c file-handling fgets fgetpos