2010-12-03 14 views
3

J'ai un problème lors de l'écriture d'un fichier sur le texte. Comme vous pouvez le voir, j'ai utilisé \n pour mettre un autre ensemble de mes données sur la ligne suivante. Le problème est lorsque je ferme le fichier et enregistrer à nouveau les données par ligne qui se termine par \n devient \n\n et ainsi de suite. Voilà pourquoi mon dossier ressemble à ceciC Programmation fprintf issue

PREMIER ENREGISTRER

test, test, test 
test, test, test 

DEUXIÈME ENREGISTRER

test, test, test 

test, test, test 

TROISIÈME ENREGISTRER

test, test, test 


test, test, test 

c'est pourquoi quand je l'afficher sur l'écran ... il y a des déchets entre ... Mon code est le suivant:

save(){ 
    int i = 0; 
    FILE *stream = NULL; 
    stream = fopen("student.txt", "wt"); 
    printf("\nSaving the student list directory. Wait a moment please..."); 
    printf("\nExiting the program..."); 
    for (i=0; i<recordCtr; i++){ 
     fprintf(stream, "%s, %s, %s\n", array[i]->studentID, array[i]->name, array[i]->course); 
    }     
} 

Aide s'il vous plaît ... des suggestions seront appréciées. Merci d'avance.

+3

Qu'est-ce que dans le tableau '[i] -> course'? A-t-il une nouvelle ligne à sa fin? Que trouve-t-on dans 'array [i] -> studentID'? A-t-il une nouvelle ligne à son début? –

+1

Il est très possible que 'array [i] -> course' ait un autre terminateur de nouvelle ligne. Astuce: 'fgets()' lit toute la ligne avec le terminateur de nouvelle ligne. Comment exactement "réenregistrement" le fichier? – ruslik

Répondre

5

Je ne sais pas ce que vous faites exactement, mais si vous analysez de nouveau le fichier avant de l'enregistrer à nouveau, vous êtes probablement oublier de supprimer l'ancien \n de la chaîne originale dernière ..

EDIT: cela est en fait juste. L'OP utilise la fonction fgets, qui inclut le terminateur de ligne. Donc, à partir de "test, test, test \ n" avec strtok, il obtiendra "test" "test" "test \ n" de sorte que quand il sera sauvegardé, un nouveau saut de ligne (l'oublier) est ajouté à le fichier.

Vous pouvez le réparer en réglant le dernier caractère null avec

linebuffer[strlen(linebuffer)-2] = '\0' 

(il est sûr depuis fgets renvoient une chaîne à zéro terminal par lui-même)

Vous pouvez également ajouter \n à délimiteurs utilisés, vous devriez vous retrouver avec le même comportement (pas sûr des jetons vides avec strtok mais IIRC ils sont juste jetés).

+0

Il reconnaît déjà ceci - 'Le problème est quand je ferme le fichier et enregistre à nouveau le fichier \ n devient \ n \ n et ainsi de suite.' – DMan

+0

@DMan: et comment penses-tu qu'il fait ça? – ruslik

+0

pourquoi un downvote réellement? – Jack

3

Je devine que cela est sur les fenêtres - changer votre ligne:

stream = fopen("student.txt", "wt"); 

à:

stream = fopen("student.txt", "wb"); 

Et vous n'obtiendrez \r supplémentaires s. Alternativement, peut-être que la dernière des chaînes fprintf a déjà une nouvelle ligne à la fin.

+0

Ce n'est pas à cause des modificateurs. – ruslik

+0

stream = fopen ("student.txt", "wb"); n'aide pas .. quoi faire? – newbie

3

Je suppose que votre champ array[i]->course contient le \ n précédemment écrit dans la dernière sauvegarde. Vérifiez le code qui remplit le tableau et assurez-vous qu'il ignore les caractères de retour à la ligne.

+0

comment est-ce que je peux m'assurer qu'il saute des caractères de nouvelle ligne ??? Y at-il une fonction pour cela ou je dois l'écrire moi-même? – newbie

3

ici:

fgets(linebuffer, 45, stream); 

retirer la fuite \n de linebuffer s'il y a une:

for (int i=strlen(linebuff)-1; i>=0 && linebuff[i]=='\n'; linebuff[i--]='\0');