Специальный символ в текстовом файле при удалении строки - PullRequest
0 голосов
/ 13 апреля 2019

Я новичок в C и пытаюсь удалить строку из текстового файла. У меня есть код, который удаляет указанную строку, но оставляет специальные символы в конце, и я понятия не имею, почему или как это исправитьit.

#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);
}

В моем текстовом файле у меня есть Test1 и Test2 в отдельных строках, Test1 в строке 1 и Test2 в строке 2. При запуске функции она удаляетстрока 2 (Test2), но оставляет специальный символ на своем месте.Почему?

1 Ответ

0 голосов
/ 13 апреля 2019

В коде есть проблемы:

  • 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...