删除行时文本文件中的特殊字符
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除行时文本文件中的特殊字符相关的知识,希望对你有一定的参考价值。
我是C的新手,我正在尝试从文本文件中删除一行,我删除指定行的代码但最后留下一个特殊的�
字符,我不知道为什么或如何修复它。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void removeBook(int line) {
FILE *file = fopen("bookrecord.csv", "r");
int currentline = 1;
char character;
FILE *tempfile = fopen("temp.csv", "w");
while(character != EOF) {
character = getc(file);
printf("%c", character);
if (character == '
') {
currentline++;
}
if (currentline != line) {
putc(character, tempfile);
}
}
fclose(file);
fclose(tempfile);
remove("bookrecord.csv");
rename("temp.csv", "bookrecord.csv");
}
void main() {
removeBook(2);
}
在我的文本文件中,我在单独的行上有Test1
和Test2
,在第1行有Test1
,在第2行有Test2
。当函数运行时它删除第2行(Test2
)但在其位置留下特殊的�
字符。为什么?
答案
代码中存在问题:
- 必须将
character
定义为int
来处理所有字节值和EOF
返回的特殊值getc()
。 - 你不测试文件是否成功打开。
character
在第一次测试中未初始化,行为未定义。- 您始终输出
character
读取,即使在文件末尾,因此您将'377'
字节值存储在输出文件的末尾,在系统上显示为�
,在某些其他系统上显示为ÿ
。 - 您应该在输出换行符后增加行号,因为它是当前行的一部分。
main
的原型是int main()
,而不是void main()
。
这是一个更正版本:
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int removeBook(int line) {
FILE *file, *tempfile;
int c, currentline;
file = fopen("bookrecord.csv", "r");
if (file == NULL) {
fprintf("cannot open input file bookrecord.csv: %s
", strerror(errno));
return 1;
}
tempfile = fopen("temp.csv", "w");
if (tempfile == NULL) {
fprintf("cannot open temporary file temp.csv: %s
", strerror(errno));
fclose(tempfile);
return 1;
}
currentline = 1;
while ((c = getc(file)) != EOF) {
if (currentline != line) {
putc(c, tempfile);
}
if (c == '
') {
currentline++;
}
}
fclose(file);
fclose(tempfile);
if (remove("bookrecord.csv")) {
fprintf("cannot remove input file bookrecord.csv: %s
", strerror(errno));
return 1;
}
if (rename("temp.csv", "bookrecord.csv")) {
fprintf("cannot rename temporary file temp.csv: %s
", strerror(errno));
return 1;
}
return 0;
}
int main() {
return removeBook(2);
}
以上是关于删除行时文本文件中的特殊字符的主要内容,如果未能解决你的问题,请参考以下文章