Лучший способ удалить строку в файле? - PullRequest
0 голосов
/ 20 апреля 2011

Я хочу удалить строку из файла, в настоящее время я зацикливаюсь на каждой строке в oldTodoFile, и если lineNumber не равен todoNumber, то добавьте ее в новый файл (todoFile).Не кажется, что это хороший способ удаления строки, есть ли лучший способ удаления строки?

FILE *oldTodoFile;
oldTodoFile = fopen("./todo.txt", "r");

FILE *todoFile;
todoFile = fopen("./todo2.txt", "w");
int lineNumber = 0;
int len;
char line[4096];

if (oldTodoFile != NULL) {
    while (fgets(line, sizeof line, oldTodoFile)) {
        len = strlen(line);
        if (len && (line[len - 1] != '\n')) {} else {
            lineNumber++;
            if (lineNumber == todoNumber) {
                // Do nothing   
            } else {
                fputs(line, todoFile);
            }
        }
    }
} else {
    printf("ERROR");
}
remove("./todo.txt");
rename("./todo2.txt", "./todo.txt");
fclose(oldTodoFile);
fclose(todoFile);

Ответы [ 3 ]

3 голосов
/ 20 апреля 2011

Файл - это просто серия байтов. Если вы хотите удалить строку, вам придется сдвинуть что-либо после этой строки назад. Я думаю, что то, что вы делаете, просто отлично, но вы также можете перезаписать файл на месте, начиная с строки, которую вы удаляете.

Для этого вам понадобятся два файловых дескриптора, указывающих на файл. Когда вы читаете из второго, вы пишете в первый.

Когда вы закончите, вы можете обрезать файл, чтобы избавиться от лишних данных в конце.

1 голос
/ 20 апреля 2011

Нет, это способ сделать это. Нет способа удалить данные из середины файла.

Возможно, вы захотите исправить свой код в случае ошибки, он все равно пытается выполнить удаление / переименование в конце.

0 голосов
/ 20 апреля 2011

Если ваша ОС поддерживает файлы с отображением в памяти, вы можете запомнить карту, а затем использовать memmove () для перемещения данных. Он может быть или не быть более эффективным, но полученный код может быть проще в реализации, обслуживании и отладке.

Это не обязательно "лучший" способ, но это то, что нужно учитывать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...