2013-03-01 5 views
2

Je travaille sur un programme qui recherche dans un fichier une chaîne spécifique qui était dans une structure lors de son écriture dans le fichier. Si je trouve une correspondance dans ce fichier, j'ai besoin d'écraser une partie de cette structure. Rechercher le fichier pour le match est super facile, mais je suis aux prises avec l'écrasement de cette structure. Ci-dessous mon code cherchant le fichier et essayant d'écraser ces données.C - Comment rechercher un fichier et en remplacer une partie

dfp = fopen(archName, "ab"); 
    if(dfp == NULL) { 
     printf("An error has occurred... %s could not be opened.\n", archName); 
     return 0; 
    } /* End if */ 

    /* Read first header file */ 
    fread(&getHeader, sizeof(getHeader), 1, dfp); 

/* Check for match */ 
    if(strcmp(fName[0], getHeader.file_name) == 0) { 
     getHeader.deleted = (char)49; 
     fwrite(&getHeader, sizeof(getHeader), 1, dfp); 

Notez que getHeader est une structure. Il y a plusieurs structures qui peuvent être stockées n'importe où dans mon fichier. J'ai besoin de rechercher chaque en-tête pour une chaîne spécifique (facile). Quand une correspondance est trouvée, cette structure doit être écrasée.

Quel type de processus serait recommandé pour accomplir une telle tâche?

Répondre

6

Vous pouvez écrire une boucle pour lire les enregistrements dans une structure d'enregistrement, un à la fois. Après chaque lecture, vous pouvez comparer l'enregistrement que vous venez de lire avec l'enregistrement désiré, en lisant l'enregistrement suivant si ce n'est pas celui dont vous avez besoin.

Vous venez de trouver l'enregistrement que vous vouliez, mais vous venez aussi de lire au-delà de l'enregistrement; vous devez chercher à remplacer l'enregistrement. Vous devez également chercher entre lire et écrire ou vice versa, à chaque fois, car la norme C indique que le comportement n'est pas défini si vous ne le faites pas. Cela signifie une recherche avant l'écriture, et une autre recherche avant de revenir à l'enregistrement suivant.

Depuis que vous avez ouvert le fichier en mode "ab", toute recherche est sans importance puisque toutes les écritures seront ajoutées à la fin. Vous voulez probablement "r+b" comme le mode à fopen().

Voir fseek() goes back to the end of file when writing a value pour une discussion récente sur les mêmes problèmes généraux.

+0

J'ai effectivement essayé d'utiliser toutes les options disponibles pour fopen, mais en vain ... Quand j'utilise "r + b" comme mode et que je tente d'écraser une structure donnée, je finis par créer une nouvelle structure directement à la suite de la structure que je souhaite écraser ... Est-ce là où fseek entrerait en jeu? Dois-je replacer le pointeur au début de la structure que je souhaite remplacer? – kubiej21

+0

Ahh ... je me suis rendu compte que j'avais une faute de frappe dans mon appel de fseek. Merci pour l'information! – kubiej21

Questions connexes