scottm
scottm

Reputation: 28699

How can I add a new line to the beginning of a file without overwriting any data?

I am trying to figure out how to write a new line of text at the beginning of a file (a header). I know I can open the file, or seek to the beginning of a file, but if I write with that, it will overwrite what's there. Do I have to write a new file and then write the other data to it line by line, or is there a better way?

Example file:

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

And I want to end up with

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:

This is what I ended up doing:

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");

Upvotes: 4

Views: 1677

Answers (3)

Andrew Jaffe
Andrew Jaffe

Reputation: 27097

Well, probably the very easiest thing is to notice that what you want to do is the equivalent of the unix cat command. If you're on unix, you could just call it from within c. Or you could read the source in gnu textutils.

But in any case all of these solutions do just rewrite the file!

Upvotes: 1

Bryan Oakley
Bryan Oakley

Reputation: 386372

You will have to rewrite the whole file, but that doesn't necessarily mean you have to read and write the original data line-by-line. Reading by lines is relatively slow, so if the file is small enough to fit in memory, read it all in one big chunk (or in large sized blocks) and then write it back after writing your new data.

Upvotes: 6

Tiago
Tiago

Reputation: 9558

You have to open a new file and write all over again.

Upvotes: 0

Related Questions