Reputation: 28699
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
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
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