Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [C]Chiarimenti fopen

  1. #1

    [C]Chiarimenti fopen

    Salve forum, vorrei alcuni chiarimenti riguardo il comando fopen (per aprire e scrivere informazioni su file).

    Per far ciò vi posto un esame universitario, dove in pratica la traccia come primo step chiedeva di aprire in lettura un file di testo .txt dove vi erano scritte le seguenti informazioni:

    88-07-73507-X;2011;Novecento;Alessandro Baricco;10.60
    88-07-92163-X;2011;Omero, Iliade;Alessandro Baricco;8.08
    ecc...

    dove la prima parte indica il codice ISBN (con la variabile x da calcolare), indi anno, autore, prezzo ecc... e ogni informazione è separata da un punto e virgola.

    Perfetto, ordunque io so che per leggere i file da testo si fa così:

    codice:
    FILE *file_lettura;
    file_lettura = fopen("books.txt", "r");
    if(fp == NULL)
    printf(“ERRORE in apertura del file”);
    while(!feof(file_lettura))
    {
    fscanf(file_lettura, "%d", &numero);
    printf("numero letto: %d\n", numero);
    }
    nel caso di numeri o cambiando la variabile dove mettere le informazioni in caso di char ecc...

    Ma in questo caso come si fà? Come si fa a far riconoscere il punto e virgola come fine informazione in lettura? Come posso mettere, per esempio, l'isbn in un intero, il nome in uno char* ecc...? Illuminatemi please!

    Il prof nella soluzione ha messo il seguente codice:

    codice:
    FILE *fp = fopen("books.txt", "r");
      if (fp == NULL)
      {
        printf("ERROR - File books.dat not found\n");
        return 0;
      }
    
    while(!feof(fp))
      {
       
        strcat(item.key,"\0");
        fscanf(fp,"\n%256[^;]",item.key);
        compute_checksum(item.key);
        
        fscanf(fp,"\n;%d",&(item.pubyear));
       
        strcat(item.title,"\0");
        fscanf(fp,"\n;%256[^;]",item.title);
        
        strcat(item.author,"\0");
        fscanf(fp,"\n;%256[^;]",item.author);
            
        fscanf(fp,"\n;%f",&(item.price));
    Dove so che, ovviamente, per memorizzare l'ISBN accede all' item.key ma come fa a far riconoscere il punto e virgola come fine informazione? Non riesco a capire.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    La soluzione proposta risolve il problema facendo uso delle direttive della [f]scanf() che puoi leggere nella documentazione della funzione [ad esempio qui].
    In sostanza con la prima fscanf() legge un (eventuale) newline e una sequenza di massimo 256 caratteri fino al ; escluso (lo indica il [^;]) ponendo tali caratteri nel campo "key" di "item"; poi con la successiva fscanf() ancora un eventuale newline, un ; e un valore intero (%d) e così via fino alla fine della riga.

    Un altro modo per risolvere il problema potrebbe consistere nel leggere il file riga per riga con una fgets(), tokenizzare ciascuna di esse con la strtok() e convertire le sottostringhe, laddove necessario, a int o float con le apposite funzioni atoi() e atof().
    every day above ground is a good one

  3. #3
    Chiarissimo, però ancora non mi è chiara una cosa.
    A cosa serve la funzione strcat?

    E come mai per leggere l'intero dopo l'ISBN ha scritto "\n;%d"? Cioè non mi è chiaro come riconosce solo l'intero con quel comando. Grazie in anticipo.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da Metalmino
    Chiarissimo, però ancora non mi è chiara una cosa.
    A cosa serve la funzione strcat?
    Non è la prima volta che vedo un'istruzione del genere. Credo che nel mondo si sia affermata tra alcune persone la strana convinzione che, così facendo, si garantisca che la stringa sia null-terminated. In realtà la documentazione della strcat() parla chiaro:

    The strcat() function appends the src string to the dest string, overwriting the null byte ('\0') at the end of dest, and then adds a terminating null byte.
    il che significa che questa cosa funziona solo se la stringa di destinazione ha già il terminatore, al più poi dopo ne aggiunge un altro (tra l'altro bisognerebbe assicurarsi che vi sia abbastanza spazio per farlo). In conclusione, è un'istruzione inutile.

    Originariamente inviato da Metalmino
    E come mai per leggere l'intero dopo l'ISBN ha scritto "\n;%d"? Cioè non mi è chiaro come riconosce solo l'intero con quel comando. Grazie in anticipo.
    Ti conviene leggere più a fondo la documentazione della scanf() (e le altre della stessa famiglia) per comprenderlo. La stringa di formato deve "matchare" l'input. In quel caso la scanf() si attenderà un eventuale '\n' seguito poi da un ; e da un intero che va salvato nell'apposita variabile passata come argomento. E' esattamente il formato del tuo input subito dopo lo ISBN: c'è un ; e poi un numero intero.
    every day above ground is a good one

  5. #5
    Siccome non sto riuscendo ben a riprodurre il codice, vorrei passarvi il problema in maniera semplicistica:

    ho un file di testo books.txt dove ci sono scritte le seguenti cose:
    88-07-73507-X;2011;Novecento;Alessandro Baricco;10.60
    88-07-92163-X;2011;Omero, Iliade;Alessandro Baricco;8.08
    88-07-71102-X;2009;L'Italia in seconda classe;Paolo Rumiz;10.20
    88-07-71023-X;2005;Il sapere liberato. Il movimento dell'open source e la ricerca;8.50

    e devo leggere il seguente file e memorizzare ogni singola informazione in delle variabili.

    inizio così:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
      char* isbn;
      int anno;
      char* title;
      char* autore;
      float prezzo;
      FILE* books;
      books= fopen ("books.txt", "r");
      while (!feof(books))
      {
            fscanf (books, "\n%256[^;]", &isbn);
            fscanf (books, "\n;%d", &anno);
            fscanf(books,"\n;%256[^;]",&title);
            fscanf(books,"\n;%256[^;]",&autore);
            fscanf(books,"\n;%f",&prezzo);}
            
            
      system("PAUSE");	
      return 0;
    }
    Potete gentilmente scrivermi un codice semplice semplice (in modo da capire il concetto) per memorizzare le informazioni prima descritte nelle apposite variabili per poi stamparla a video? Siete la mia salvezza per domani praticamente!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.