Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2012
    Messaggi
    2

    [C] Lettura dati con caratteri speciali da file

    Salve, mi appello al vostro aiuto per una cosa probabilmente molto semplice ma sulla quale sto perdendo il sonno. Devo leggere dei dati da file, e fin qui nessun problema, ipotizzandoli separati da spazio, ossia:

    intero1 stringa1 stringa2
    intero2 stringa3 stringa4
    .
    .
    .
    interon stringan stringan+1

    mi basta fare questo, e tutto funziona perfettamente.

    codice:
    while(!feof(nome_file)) {
      fscanf(nome_file,"%d %s %s",&intero,stringa,stringa2);
    }
    Il problema sorge quando i dati sono separati da un carattere, mettiamo un ';' che non voglio leggere.
    Ossia:

    intero1;stringa1;stringa2
    intero2 stringa3;stringa4
    .
    .
    .
    interon;stringan;stringan+1


    Ho tentato con [^;] (che in teoria dovrebbe leggere il tutto senza il carattere specificato), nel modo che segue, ma senza successo:

    codice:
    while(!feof(nome_file)) {
      fscanf(nome_file,"%[^;] %[^;] %[^;]",&intero,stringa,stringa2);
    }
    Ho fatto poi altre prove, ma senza risultati, al più finendo in un ciclo infinito. Penso che ci sia un modo diretto per farlo (anzi, ne son piuttosto sicuro), o l'unica è leggere tutta la pappardella in una volta e poi smanettarci su con taglia e cuci vario (ditemi di no, vi prego)?

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Devi crearti una funzione o codice , che ti separi la stringa in più parti
    ci sono approcci diversi per ottenere lo stesso risultato
    se la stringa ha sempre la stessa lunghezza
    4 caratteri + 5 caratteri + 8 caratteri
    potresti usare la funzione strncpy

    se hanno dimensioni diverse ,devi cercare il carattere delimitatore e splittare la stringa ,
    ma il codice lo devi fare tu .
    Tecnologia

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    156

    Re: [C] Lettura dati con caratteri speciali da file

    Ciao

    Originariamente inviato da Qdoot
    codice:
      fscanf(nome_file,"%[^;] %[^;] %[^;]",&intero,stringa,stringa2);
    prova con

    codice:
      fscanf(nome_file,"%d;%[^;];%[^;]",&intero,stringa,stringa2);

  4. #4
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Prova cosi .

    http://it.wikipedia.org/wiki/Strtok



    esempio:

    codice:
    int main(int argc, char *argv[])
    {
        FILE *nome_file;
        char *p;
        char buffer[30];
        int numero;
        char stringa[20];
        char stringa2[20];
        nome_file=fopen("dati.txt","r"); 
        if(nome_file==NULL)puts("errore apertura file"); 
        while(fgets(buffer,30,nome_file)!=NULL)
       {
               p = strtok (buffer," ;");//spazio e ;
              
                numero=atoi(p);
                p = strtok (NULL, " ;");
                strcpy(stringa,p);
                p = strtok (NULL, " ;");
                strcpy(stringa2,p);
                
            printf("numero --> %d  stringa --> %s   stringa2--> %s\n" ,numero,stringa,stringa2); 
       } 
      system("PAUSE");	
      return 0;  
    }
    Tecnologia

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2012
    Messaggi
    2
    Zucchino, con quella soluzione purtroppo cicla infinitamente il primo record del file.
    torn, ringrazio anche te ma mi interesserebbe riuscire a capire come fare il tutto in un colpo solo, così penso che sarei potuto riuscirci.

    EDIT: Ho fatto un po' di prove, questi i risultati (il mistero si infittisce)

    codice:
    //Così come proposto da Zucchino non funziona 
    fscanf(fp,"%d;%[^;];%[^;]",&intero,str1,str2);
    
    //Così però funziona (mettendo un ; anche dopo l'ultimo elemento del record)
    fscanf(fp,"%d;%[^;];%[^;];",&intero,str1,str2);
        
    //Con un intero finale e; annesso non funziona né così
    fscanf(fp,"%d;%[^;];%[^;];%d;",&intero,str1,str2,&intero2);
    //né così
    fscanf(fp,"%d;%[^;];%[^;];%d",&intero,str1,str2,&intero2);

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 © 2024 vBulletin Solutions, Inc. All rights reserved.