Как добавить новую строку в начало файла, не перезаписывая данные? - PullRequest
4 голосов
/ 02 февраля 2009

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

Файл примера:

1, 01/01/09, somedata, foo, bar
2, 01/02/09, somedata, foo, bar
3, 01/03/09, somedata, foo, bar

И я хочу закончить с

3, 1-3, 01/04/09
1, 01/01/09, somedata, foo, bar
2, 01/02/09, somedata, foo, bar
3, 01/03/09, somedata, foo, bar

EDIT:

Вот что я в итоге сделал:

FILE *source;
FILE *output;
char buffer[4096];
size_t bytesRead;

memset(buffer, 0, sizeof(buffer);

source = fopen("sourcefile.txt", "r");
output = fopen("output.txt", "w+");

fprintf(output, "my header text\n");

while(!feof(source))
{
  bytesRead = fread(&buffer, 1, sizeof(buffer), source);
  fwrite(&buffer, 1, bytesRead, output);
}

fprintf(output, "my footer text");

fclose(source);
fclose(output);

remove(source);
rename("output.txt", "source.txt");

Ответы [ 3 ]

6 голосов
/ 02 февраля 2009

Вам придется переписать весь файл, но это не обязательно означает, что вы должны читать и записывать исходные данные построчно. Чтение по строкам относительно медленное, поэтому, если файл достаточно мал, чтобы поместиться в памяти, прочитайте все это одним большим блоком (или большими блоками), а затем запишите его после записи новых данных.

1 голос
/ 02 февраля 2009

Ну, наверное, очень самое простое - это заметить, что вы хотите сделать эквивалент команды unix cat. Если вы работаете в Unix, вы можете просто позвонить изнутри c. Или вы можете прочитать исходный текст в gnu textutils.

Но в любом случае все эти решения просто переписывают файл!

0 голосов
/ 02 февраля 2009

Вы должны открыть новый файл и написать заново.

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