当前删除部分代码。
printf("Opening input and output file... ");
if ((ifp = fopen("baza.txt", "r")) == NULL){
fprintf(stderr, "Error! input file open error.");
exit(1);
}
if ((ofp = fopen("baza.txt", "w")) == NULL){
fprintf(stderr, "Error! output file open error");
exit(1);
}
printf("OK\n");
printf("Updating file... ");
rewind(ofp);
rewind(ifp);
i = 0;
while (!feof(ifp)){
if (ftell(ifp) == point[i]){
i++;
for (s = 0; s < 5; s++)
fgets(buffer, 30, ifp);
}
fgets(buffer, 30, ifp);
fputs(buffer, ofp); fputs("\n", baza);
}
printf("OK\n");
printf("Closing input and output files... ");
rewind(ifp);
rewind(ofp);
fclose(ifp);
fclose(ofp);
printf("OK\n");
文字档案:
Samsung
Galaxy Mini 2
250
14
-
HTC
One X
350
25
-
Sony
XPERIA
300
9
-
HUAWEI
Ascend Y530
116
9
-
首先要明确一些事情。已经有一部分代码找到了特定的输入(因为这是一个“移动商店”控制台应用程序,用户可以搜索当前在商店中的开发人员,型号,价格或数量的项目,然后是每个电话信息' - '。
所以说用户正在搜索移动价格350,它将跳转到第一个价格,比较,只有5行,比较等。如果找到正确的值,它会在其上方存储“ - ”的位置(第一项的特例,因为它只有一个空格而不是' - '。所有这一切现在都很精细,这就是我没有包含该代码的原因。
当我尝试从库中删除某个手机时,问题就开始了。我想到的是它以2种模式打开文件,读取和写入,并将两者都重新开始(以防万一)。现在因为w(ofp)打开“baza.txt”文件是空的,但它仍然包含在ifp -r中,我通过ifp文件进行随机播放并将所有内容导入到ofp,除非指针到达点的数组位置
- &GT;我唯一的问题是是当我打开这个文本文件时,我只能找到上一个文件的最后一行。它看起来像是在第一行插入文本,从不跳到第二行。在+模式下,这可以正常工作,但问题是在+模式下它不会删除内容,在文件中留下一些混乱 - 重复,剩余等等,因为文件会缩小。
我打开它时也尝试关闭ofp(因为它现在是一个空文件)并在+中打开它,但编译器显然不喜欢它。
对不起,很长的帖子
TL /博士。请阅读上面的 - &gt; 。
答案 0 :(得分:3)
您无法为同时读取和写入 打开相同的文件,第二次fopen
调用将截断文件,因此您将丢失所有内容。
相反,处理您案例的常用方法是写入临时文件,完成后将临时文件重命名为原始文件。
作为旁注,不要while (!feof(...))
,它在大多数情况下不会按预期工作,因为文件结束标志在之后才会设置< / em>您尝试从文件末尾读取,并且您将再循环一次循环。相反,例如, while (fgets(...) != NULL)
。
答案 1 :(得分:1)
您永远不应该打开要在w+
模式下阅读的文件,因为在阅读之前会将其截断。充其量,你可以保留系统或库放入缓存的内容,但它是未确定的行为。
在阅读之前回放ofp
文件时,您应该以{{1}}模式打开它,但a+
甚至会更好,因为它会在文件开头提供最初定位的指针。要解决文件末尾的垃圾问题,你只需要在关闭它之前在当前偏移处截断r+
,当然不需要倒带!
程序的结尾应该是:
ofp