2015-04-20 29 views
5

Ho un set di voci di elenco che ho letto alla struttura. Questo codice dovrebbe sostituire l'elemento esistente. Un utente inserisce la posizione (1..n) e il record corrispondente deve essere sostituito. Ma non funziona, il record mette alla fine del file. Cosa c'è che non va?Scrive fwrite alla fine del file dopo aver cercato fino alla fine

int pos; 
FILE* file = fopen("file.txt", "ab+"); 
scanf("%d", &pos); 
Schedule sch = getScheduleRecord(); 
fseek(file, sizeof(Schedule) * (pos - 1), SEEK_SET); 
fwrite(&sch, sizeof(sch), 1, file); 
fclose(file); 
break; 
+0

Sì, funziona. grazie – Ivan

+0

@ user3121023 Potresti postare questo come una risposta in modo che possa essere upvoted e la domanda contrassegnata come risposta? – MicroVirus

risposta

2

Prova "rb +"
"ab +" si apre il file in accodamento per binario con lettura e scrittura. La scrittura è consentita solo alla fine del file. Il file verrà creato.
"rb +" apre il file in lettura per binario con lettura e scrittura. La lettura o la scrittura può avvenire in qualsiasi posizione nel file utilizzando uno fseek() quando si passa dalla lettura alla scrittura. Il file deve esistere o fopen fallirà.
"wb +" apre il file in scrittura per binario con lettura e scrittura. Il file verrà creato, ma se il file esiste, il contenuto verrà cancellato.
Tuttavia è possibile nidificare le chiamate a fopen

FILE* file; 
if ((file = fopen("file.txt", "rb+")) == NULL) {//open for read 
    //if file does not exist, rb+ will fail 
    if ((file = fopen("file.txt", "wb+")) == NULL) {//try to open and create 
     //if file can not be created, exit 
     printf ("Could not open file\n"); 
     exit (1);//failure 
    } 
}