RISOLTO Lettura di stringhe da file con fgets

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

Vito-

Utente Attivo
Messaggi
193
Reazioni
15
Punteggio
43
Ciao ragazzi, ho un file in cui ci sono scritte delle stringhe. Quando vado a leggere queste stringhe con fgets e poi con printf le stampo, l'ultima viene stampata 2 volte. Questo é il pezzo di codice

C:
void visualizza_record()
{
    printf("Ecco la lista dei tuoi Record:\n\n");
    ptrTuttiRecord = fopen("Lista_Record", "r");
    if(ptrTuttiRecord)
    {
        while(!feof(ptrTuttiRecord))
        {
            fgets(titoli, N, ptrTuttiRecord);
            printf("%s", titoli);
        }
    }
    else
    {
        printf("Errore di file");
    }
    fclose(ptrTuttiRecord);
 
Il problema è la feof fatta in quel modo molto probabilmente. Dovresti usarla all'interno del ciclo, in un if, come vedi ad esempio qui https://www.tutorialspoint.com/c_standard_library/c_function_feof.htm

Ho cercato anche in rete ed in effetti è così. Questo è praticamente il tuo stesso problema https://stackoverflow.com/questions/1642789/fgets-in-c-repeats-last-line/47002678

C'è anche un errore nel tuo codice: fai una fclose anche se la fopen fallisce. fclose dovresti inserirlo nell'if, dopo il while.
Personalmente riscriverei però la funzione in questo modo:

C:
void visualizza_record()
{
    printf("Ecco la lista dei tuoi Record:\n\n");
    ptrTuttiRecord = fopen("Lista_Record", "r");
    if(!ptrTuttiRecord)
    {
        printf("Errore di file");
        return;
    }

    while(!feof(ptrTuttiRecord))
    {
        fgets(titoli, N, ptrTuttiRecord);
        printf("%s", titoli);
    }
    fclose(ptrTuttiRecord);
}

Il problema di questo feof usato così, è che fa quello che ti aspetti solo dopo l'ultimo fgetc (quindi fai un ciclo in più).
 
Ti ringrazio, come sempre gentilissimo, ma
C:
while (true)
{
  fgets(buffer,100,soubor);
  if (feof(soubor))
    break;
  fputs (buffer , stdout);
}
fclose(soubor);
qui cosa vuol dire quel true nella condizione del while??
 
Ti ringrazio, come sempre gentilissimo, ma
C:
while (true)
{
  fgets(buffer,100,soubor);
  if (feof(soubor))
    break;
  fputs (buffer , stdout);
}
fclose(soubor);
qui cosa vuol dire quel true nella condizione del while??
Che cicla SEMPRE (praticamente è un ciclo infinito) finchè non arriva all'istruzione Break che lo fa uscire dal loop.
 
Più semplicemente
Codice:
while(fgets(titoli, N, ptrTuttiRecord) != NULL)
{
    printf("%s", titoli);
}
Questo perché il eof viene segnalato solo dopo avere fallito una lettura.
 
C:
printf("\n\nQuale record vuoi visualizzare?\nInserisci il titolo qui di seguito: ");
    getchar();
    gets(recordVisualizza);
    ptrFileRecord = fopen(recordVisualizza, "r");
    if(ptrFileRecord)
    {
        fgets(descrizione, M, ptrFileRecord);
        fgets(luogo, N, ptrFileRecord);
        fgets(amici, N, ptrFileRecord);
        fgets(orario, 6, ptrFileRecord);
        fgets(data, 11, ptrFileRecord);
        fclose(ptrFileRecord);
        printf("\nDescrizione: %s", descrizione);
        printf("\nLuogo: %s", luogo);
        printf("\nAmici: %s", amici);
        printf("\nOrario: %s\n", orario);
        printf("\nData: %s\n", data);
    }
    else
    {
        printf("Errore di file");
    }

Questo é il continuo della funzione che ho scritto sopra. Perché mi stampa tutto correttamente ma nell'ultimo printf dopo Data: non mette niente? E' come se non lo leggesse data
 
Controlla il valore di ritorno delle fgets(), se è NULL significa che c’è un errore di lettura e devi abortire l’operazione segnalando l’errore.
 
Devi controllare il valore di ritorno di ogni fgets() che usi. E come lo controlli? Con una istruzione if(), altrimenti con cosa?
 
Dipende da come è scritto il documento.
fscanf() e fgets() sono due funzioni differenti, quindi si comportano in maniera diversa. Per questo io continuo a battere sul chiodo: occorre sempre controllare il valore di ritorno delle funzioni, in caso di possibili errori.
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top