Mi stavo trastullando con un po 'di codice che stava aprendo, leggendo e modificando un file di testo. Un rapido (semplificato) esempio potrebbe essere:L'uso di "r +" in fopen su windows vs linux
#include <stdio.h>
int main()
{
FILE * fp = fopen("test.txt", "r+");
char line[100] = {'\0'};
int count = 0;
int ret_code = 0;
while(!feof(fp)){
fgets(line, 100, fp);
// do some processing on line...
count++;
if(count == 4) {
ret_code = fprintf(fp, "replaced this line\n");
printf("ret code was %d\n", ret_code);
perror("Error was: ");
}
}
fclose(fp);
return 0;
}
Ora su Linux, compilato con gcc (4.6.2) questo codice viene eseguito, e modifica linea 5 del file. Lo stesso codice, eseguito su Windows7 compilato con Visual C++ 2010, esegue e afferma di aver avuto esito positivo (riporta un codice di ritorno di 19 caratteri e perror
dice "Nessun errore") ma non riesce a sostituire la linea.
Su Linux il mio file ha le autorizzazioni complete:
-rw-rw-rw- 1 mike users 191 Feb 14 10:11 test.txt
E per quanto mi riguarda posso dire che sia la stessa su Windows:
test.txt (tasto destro del mouse) -> Proprietà -> Sicurezza
"Consenti" è selezionato per Leggi & Scrivi per utente, sistema e amministratore.
Ottengo gli stessi risultati utilizzando gcc di MinGW su Windows, quindi so che non è una "funzione" di Visual C++.
Mi manca qualcosa di ovvio, o è il fatto che non ottengo errori, ma anche nessun output solo una "funzionalità" non documentata di utilizzare r+
con fopen()
su Windows?
EDIT:
Sembra anche a Microsoft's site dicono "R +" dovrebbe aprire per la lettura e scrittura. Hanno anche aggiunto questa nota:
Quando si specifica il tipo di accesso "r +", "w +" o "a +", sono consentiti sia la lettura che la scrittura (il file è detto aperto per "aggiornamento") . Tuttavia, quando si passa dalla lettura alla scrittura, è necessario eseguire un'operazione fflush, fsetpos, fseek o rewind. La posizione corrente può essere specificata per l'operazione fsetpos o fseek, se lo si desidera.
Così ho provato:
...
if(count == 4) {
fflush(fp);
ret_code = fprintf(fp, "replaced this line\n");
fflush(fp);
printf("ret code was %d\n", ret_code);
...
inutilmente.
Hai provato a svuotare il flusso utilizzando 'fflush' dopo l'operazione di scrittura? – Cyclonecode
Non sono sicuro se questo è il problema, ma potrebbe essere necessario chiamare 'fseek' quando si passa dalla lettura e scrittura dal file – Hasturkun
@KristerAndersson - sì, appena aggiornato per chiarire Ho visto la nota sul sito MSDN che ti dice dovresti aggiornare il flusso con uno dei 'f()' così ho provato 'fflush()' ing prima e dopo la scrittura, ma senza dadi. –
Mike