在C中删除文件中的特定行

时间:2015-01-14 15:09:33

标签: c file input

当前删除部分代码。

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;

2 个答案:

答案 0 :(得分:3)

您无法为同时读取和写入 打开相同的文件,第二次fopen调用将截断文件,因此您将丢失所有内容。

相反,处理您案例的常用方法是写入临时文件,完成后将临时文件重命名为原始文件。

作为旁注,不要while (!feof(...)),它在大多数情况下不会按预期工作,因为文件结束标志在之后才会设置< / em>您尝试从文件末尾读取,并且您将再循环一次循环。相反,例如, while (fgets(...) != NULL)

答案 1 :(得分:1)

您永远不应该打开要在w+模式下阅读的文件,因为在阅读之前会将其截断。充其量,你可以保留系统或库放入缓存的内容,但它是未确定的行为。

在阅读之前回放ofp文件时,您应该以{{1​​}}模式打开它,但a+甚至会更好,因为它会在文件开头提供最初定位的指针。要解决文件末尾的垃圾问题,你只需要在关闭它之前在当前偏移处截断r+,当然不需要倒带!

程序的结尾应该是:

ofp