C语言删除文件中的特定行

Deleting specific lines in a file in C

当前正在删除部分代码。

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
-

首先要弄清楚一些事情。已经有一部分代码可以找到特定的输入(因为这是一个 "mobile store" 控制台应用程序,用户可以搜索开发商、型号、价格或当前商店中的商品数量,然后是分隔符每个 phone 信息之间 '-'.

假设用户正在搜索移动价格 350,它将跳转到第一个价格,比较,仅 5 行,比较等。如果找到正确的值,它会存储 '-' 的位置在它上面(第一项的特殊情况,因为它只有一个空白 space 而不是 '-'。所有这些直到现在都可以正常工作,这就是为什么我没有包含该代码。

当我尝试从库中删除某个 phone 时,问题就出现了。我的想法是,它以两种模式打开文件,读取和写入,并倒回开头(以防万一)。现在因为 "baza.txt" 文件由于在 w (ofp) 中打开而为空,但它仍然包含在 ifp - r 中,我随机播放 ifp 文件并将所有内容导入 ofp,除非指针到达点的数组位置.

-> 我遇到的唯一问题 是当我打开这个文本文件时,我只能找到前一个文件的最后一行。看起来它不断地在第一行绘制文本,从不跳到第二行。在 a+ 模式下这工作正常,但问题是在 a+ 模式下它不删除内容,在文件中留下一团糟 - 重复,剩余等,因为文件被缩小。

我也试过在打开它时立即关闭它(因为它现在是一个空文件)并在 a+ 中打开它,但编译器显然不喜欢那样。

抱歉久了post

Tl/Dr。阅读上面的->

您不能打开同一个文件进行读取和写入分开,第二个fopen调用将截断文件,因此您将丢失所有内容。

通常处理您的情况的方法是写入临时文件,完成后将临时文件重命名为原始文件。

作为旁注,不要这样做 while (!feof(...)),在大多数情况下它不会像您预期的那样工作,因为文件结束标志直到 [=19] 才会被设置=]after 你尝试从文件末尾开始读取,你将额外重复循环一次。相反,例如while (fgets(...) != NULL).

切勿在 w+ 模式下打开要从中读取的文件,因为在读取之前会截断该文件。充其量您可以保留系统或库放入缓存中的内容,但这是未终止的行为。

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

你的程序结束应该是:

printf("OK\n");
printf("Closing input and output files... ");
    off_t offset = ftell(ofp);
    ftruncate(ofp, offset);
    /* rewind(ifp); useless
    rewind(ofp); */
    fclose(ifp);
    fclose(ofp);
printf("OK\n");