删除行时文本文件中的特殊字符

时间:2019-04-13 14:20:43

标签: c

我是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 == '\n') {
            currentline++;
        }
        if (currentline != line) {
            putc(character, tempfile);
        }
    }

    fclose(file);
    fclose(tempfile);
    remove("bookrecord.csv");
    rename("temp.csv", "bookrecord.csv");
}

void main() {
    removeBook(2);
}

在我的文本文件中,我在单独的行上有Test1Test2,在行1上有Test1,在行2上有Test2。运行该函数时,它将删除第2行(Test2),但保留特殊的字符。为什么?

1 个答案:

答案 0 :(得分:0)

代码中有问题:

  • 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\n", strerror(errno));
        return 1;
    }

    tempfile = fopen("temp.csv", "w");
    if (tempfile == NULL) {
        fprintf("cannot open temporary file temp.csv: %s\n", strerror(errno));
        fclose(tempfile);
        return 1;
    }

    currentline = 1;
    while ((c = getc(file)) != EOF) {
        if (currentline != line) {
            putc(c, tempfile);
        }
        if (c == '\n') {
            currentline++;
        }
    }

    fclose(file);
    fclose(tempfile);

    if (remove("bookrecord.csv")) {
        fprintf("cannot remove input file bookrecord.csv: %s\n", strerror(errno));
        return 1;
    }
    if (rename("temp.csv", "bookrecord.csv")) {
        fprintf("cannot rename temporary file temp.csv: %s\n", strerror(errno));
        return 1;
    }
    return 0;
}

int main() {
    return removeBook(2);
}