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");
当前正在删除部分代码。
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");