2010-12-05 3 views
0

les gars peuvent vous me aider avec mon code .. Je veux modifier une ligne spécifique dans un fichier texte en utilisant ce code ci ont ...Modification d'un fichier texte dans c

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 


struct studentinfo{ 

     char id[8]; 
     char name[30]; 
     char course[5]; 
}s1; 

int main(void){ 

    FILE *stream = NULL; 
    FILE *stream2 = NULL; 
    stream = fopen("studentinfo.txt", "rt"); 
    stream2 = fopen("studentinfo2.txt", "w+"); 

    char arr [100]; 
    char arr2[100]; 
    char arr3[100]; 
    int i=0; 
    int count=0; 

    printf("enter details: "); 
    gets(arr2); 
    printf("enter new student id: "); 
    gets(arr3); 

    while(!feof(stream)){ 
    fgets(arr, 6, stream); 
     if(strcmp(arr, arr2)!=0){ 
     fprintf(stream2, "%s", arr); 
     }else printf("student id found!"); 
    } 
    fclose(stream); 
    fclose(stream2); 
    getch(); 
} 

Le programme supprime avec succès L'identifiant étudiant w/c a été entré par l'utilisateur s'il correspond aux données dans le fichier texte.

mais je ne sais toujours pas comment remplacer l'identifiant de l'étudiant ou tous les champs connexes.

ce programme seulement copie des données qui ne correspond pas à l'entrée de l'utilisateur et la stocker dans un autre fichier texte (j'ai 2 fichiers texte) c'est la sortie si l'utilisateur est entré 12345

la façon dont il stocke les données à l'autre fichier:

, nom1, BSBA

12346, nom2, BSBA

12347, NAME3, BSBA

12350, nom4, BSBA

12390, nom5, bs

ET CECI EST LE FICHIER ORIGINAL:

12345, nom1, BSBA

12346, nom2, BSBA

12347, NAME3 , BSBA

12350, nom4, BSBA

123 90, name5, bs

de meilleures solutions? merci :) de toute façon merci encore à aix, coz je l'ai eu cette idée de lui ... malheureusement je ne peux pas le finir ... j'espère que vous pouvez m'aider ...

Répondre

2

Vous lisez seulement 5 caractères à la fois. Bien que cela fonctionne (parce que les fgets s'arrêteront à la fin d'une ligne), c'est très inefficace et cela signifie que vous comparez les entrées des utilisateurs à tous les 6 caractères d'un fichier, même si ce contenu n'est pas l'identifiant. Si vous voulez continuer avec l'approche de votre programme, quand vous obtenez une correspondance avec l'entrée de l'utilisateur, vous devez lire (et rejeter) le reste de la ligne avant de continuer à examiner les lignes suivantes.

Pour les lignes qui ne correspondent pas, vous devriez lire (et copier dans le nouveau fichier) le reste de la ligne sans la comparer à l'entrée de l'utilisateur (puisque vous savez que ce n'est pas l'ID étudiant).

Je suppose que la personne qui a écrit la tâche attendait de vous que vous lisiez une ligne entière, la divisiez (en cherchant les virgules) dans les différents champs et insériez l'information dans vos structures studentinfo. Ensuite, traitez le studentinfo de la manière demandée par l'assignation, et enfin écrivez le nouveau fichier avec les données modifiées.

Bien que vous puissiez faire en sorte que votre approche fonctionne pour supprimer un enregistrement d'un ID d'étudiant spécifié, elle est très rigide. La recherche d'un enregistrement ou l'ajout d'un enregistrement nécessiterait une réécriture complète de votre programme. Si vous aviez du code capable de lire les informations dans un tableau de struc- tures de studentinfo, et de réécrire ces informations, tout traitement que vous deviez faire fonctionnerait simplement sur ces struc- tures et les modifications seraient beaucoup plus réduites.

Ainsi, dans le code pseudo, vous voulez quelque chose comme ça

allocate space for one line of the file 
allocate space for an array of struct studentinfos 

readinfo function: 

open the student info file for reading 
set the count of student records to 0 
while not at eof 
    read in a line 
    split the line on commas 
     copy the bit before the first comma to the 'id' field of the newly allocated studentinfo record 
     copy the bit between first and second commas to the name field 
     copy the bit from the second comma to the course field 
    add one to the count of student records 
go back to read another line 
close the file 

writeinfo function: 
open the studentinfo file for writing 
loop over the studentinfo structs in order 
    writeout the id, name and course strings of the current record, separated by comma and followed by new line 
close the file 
deletestudent function: 
read a course id from the user (or read it in your main program and pass it here as a parameter) 
loop over the studentinfo array 
    compare the id to the one of the current record 
    if a match 
     shift all records after this down one by copying them over the top of the record before 
     subtract one from the number of student records (since we've deleted one) 
     return from the function indicating found and delete 
repeat for next record 
if you complete looking at all records, 
    return from the function indicating no match found 
+0

cette solution est presque le même que ce que notre professeur nous a dit de faire. :) vous êtes vraiment incroyable mr. Paul. essayez de faire celui-ci @ newbieatc.い ん ば っ く だ い – newbie

+0

ど も あ り が と à vous débutant ... – iamanapprentice

+0

merci mr.paul: D – iamanapprentice

1

Vous ne pouvez pas directement modifier un texte fichier. Chaque fois que vous avez besoin de changer un contenu particulier, vous devez d'abord le modifier en mémoire et ensuite tout réécrire.

Questions connexes