2009-02-02 6 views
4

J'essaie de comprendre comment écrire une nouvelle ligne de texte au début d'un fichier (un en-tête). Je sais que je peux ouvrir le fichier, ou chercher au début d'un fichier, mais si j'écris avec cela, il va écraser ce qui est là. Dois-je écrire un nouveau fichier, puis écrire les autres données ligne par ligne, ou y a-t-il un meilleur moyen?Comment puis-je ajouter une nouvelle ligne au début d'un fichier sans écraser les données?

fichier Exemple:

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

Et je veux finir avec

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:

C'est ce que je fini par faire:

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

Vous devriez vérifier les erreurs sur * fopen *, * fwrite * et * fclose * (ou vérifier la taille du fichier à la fin) avant de considérer l'action réussie, ** puis ** et à la fin * renommer * l'original, puis * renommer * le nouveau, puis * dissocier * l'ancien (à son nom de temp). Sinon, vous avez peut-être perdu des données en silence. – NVRAM

Répondre

6

Vous devrez réécrire le fichier entier, mais cela ne signifie pas nécessairement que vous devez lire et écrire les données d'origine ligne par ligne. La lecture par lignes est relativement lente, donc si le fichier est assez petit pour tenir en mémoire, lisez-le en un seul gros morceau (ou en blocs de grande taille), puis réécrivez-le après avoir écrit vos nouvelles données.

0

Vous avoir à ouvrir un nouveau fichier d écris à nouveau.

1

Eh bien, probablement le très chose la plus simple est de remarquer que ce que vous voulez faire est l'équivalent de la commande unix cat. Si vous êtes sur unix, vous pouvez simplement l'appeler à partir de c. Ou vous pouvez lire la source dans les textutils gnu.

Mais dans tous les cas, toutes ces solutions ne font que réécrire le fichier!

Questions connexes