Fscanf Separatore di stringhe

di il
10 risposte

Fscanf Separatore di stringhe

Salve

quale errore compio nel voler importare da file varie stringhe separate da un carattere, la virgola in questo caso, utilizzando questo codice:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX 100

typedef char matrice[MAX]

int main(){
matrice elenco[MAX];
int z=0;
FILE * fp;

   fp = fopen("file.txt", "r");

   while(!feof(fp)){
      fscanf(fp, "%[^ ,]", elenco[z];
      printf("%s", elenco[z]);
      z++;
   }


return 0;
}

Il file:
car,weapon,bomb,newbie,costant,character,cooperator

Nella stampa mi stampa solamente la prima parola, il resto e' tutto sballato. Quel %[^ ,] non dovrebbe crearmi un nuovo tipo di importazione che importa tutto fino a trovare una , che dovrebbe vedere come una nuova riga?

10 Risposte

  • Re: Fscanf Separatore di stringhe

    La fscanf deve essere

    "%[^ ,],"

    e nella printf

    "%s\n"
  • Re: Fscanf Separatore di stringhe

    oregon ha scritto:


    La fscanf deve essere

    "%[^ ,],"

    e nella printf

    "%s\n"

    Quindi se fosse un due punti il separatore avrei dovuto scrivere cosi:
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #define MAX 100
    
    typedef char matrice[MAX];
    
    int main(){
    matrice elenco[MAX];
    int z=0;
    FILE * fp;
    
       fp = fopen("file.txt", "r");
    
       while(!feof(fp)){
          fscanf(fp, "%[^ :]:", elenco[z]);
          printf("%s\n", elenco[z]);
          z++;
       }
    
    
    return 0;
    }
    

    Non l'avevo letta questa cosa nella descrizione della fscanf/scanf, mi sapresti spiegare il motivo per il quale si deve ripetere il carattere escluso?
  • Re: Fscanf Separatore di stringhe

    Perchè tutti quanti utilizzano fscanf()?
    E' più semplice (e più sicura) la fgets() e poi sul buffer letto posso fare quello che voglio, strchr(), strstr(), strtok()...
    Nel caso specifico, una volta letta la linea si può tranquillamente fare un ciclo per estrarre le stringhe separate da ',' con un semplice strchr( str, ',' ) finchè questa non ritorna NULL (ovvero non ci son più virgole.
  • Re: Fscanf Separatore di stringhe

    candaluar ha scritto:


    Perchè tutti quanti utilizzano fscanf()?
    Quando ho preparato informatica il mio prof. ci aveva obbligato a non usare fgets() ... e toglieva punti a chi la usava
    Chissa come mai , non lo mai capito...
  • Re: Fscanf Separatore di stringhe

    candaluar ha scritto:


    Perchè tutti quanti utilizzano fscanf()?
    E' più semplice (e più sicura) la fgets() e poi sul buffer letto posso fare quello che voglio, strchr(), strstr(), strtok()...
    Nel caso specifico, una volta letta la linea si può tranquillamente fare un ciclo per estrarre le stringhe separate da ',' con un semplice strchr( str, ',' ) finchè questa non ritorna NULL (ovvero non ci son più virgole.
    Non conosco molto la fgets() causa non averla quasi mai utilizzata, so che e' piu sicura e più facile da usare, dato che tu la usi posso chiederti come faresti, per esempio, con la fgets, a importare da file delle stringhe alcune composte interamente da lettere, altre da lettere piu altri caratteri e altre sono righe vuote e numeri, devi importare solamente le stringhe composte da lettere dell'alfabeto ed escludere le altre.

    Con fscanf non penso sia possibile, ho dovuto fare un ciclo che mi controllasse la presenza di questi caratteri speciali / numeri o di '\n'
  • Re: Fscanf Separatore di stringhe

    @GiggiSk8 Il fatto che il prof. non la accetti mi sembra un pò strano, ma può essere che vi abbia spiegato l'uso della fscanf() e volesse controllare se avevate capito o no.
    Rimane il fatto che se tu apri un qualsiasi progetto C/C++ professionale e ricerchi fscanf() o sua sorella scanf() non troverai niente, indipendentemente da quello che dice il prof.
    Non conosco molto la fgets() causa non averla quasi mai utilizzata, so che e' piu sicura e più facile da usare, dato che tu la usi posso chiederti come faresti, per esempio, con la fgets, a importare da file delle stringhe alcune composte interamente da lettere, altre da lettere piu altri caratteri e altre sono righe vuote e numeri, devi importare solamente le stringhe composte da lettere dell'alfabeto ed escludere le altre.
    E' più sicura perchè legge al massimo il numero di caratteri specificato, quindi non rischi buffer overflow.
    Con la fgets() non fai nessuna di queste ricerche/analisi che elenchi, semplicemente ti leggi una riga da file (o da stdin): nell'idea di Unix (e quindi di un programmatore C) c'è la semplicità di fare piccoli programmi/funzioni che eseguono operazioni semplici e questo dovrebbe bastare a dire NO alla (f)scanf().
    Pertanto, con fgets() leggi una riga da file e la tieni in un buffer es.:
    char buffer[80];
    poi sulla stringa ci fai quello che vuoi, ad esempio usi strchr() per trovare le posizioni delle virgole; con le posizioni puoi estrarre le sottostringhe.
    Puoi scrivere una funzione che data la riga ne analizza il contenuto carattere per carattere e quindi dire se ci sono solo cifre, solo alfabetici oppure un mix... ti devi costruire dei piccoli mattoncini che poi usi!
  • Re: Fscanf Separatore di stringhe

    candaluar ha scritto:


    @GiggiSk8 Il fatto che il prof. non la accetti mi sembra un pò strano, ma può essere che vi abbia spiegato l'uso della fscanf() e volesse controllare se avevate capito o no.
    Rimane il fatto che se tu apri un qualsiasi progetto C/C++ professionale e ricerchi fscanf() o sua sorella scanf() non troverai niente, indipendentemente da quello che dice il prof.
    Sono pienamente d'accordo con te
    Ho scritto quello perchè,leggendo in un altro messaggio di exSnake ho visto riferimento al sito del Politecnico di Torino , e studiando li so che alcuni professori non vogliono che si usi(non solo il mio) ... i motivi non li so
  • Re: Fscanf Separatore di stringhe

    Durante le lezioni si possono fare delle domande? Io chiederei perchè si preferisce l'uso della fscanf() a fgets(). Comunque stiamo andando OT e chiudo qui
  • Re: Fscanf Separatore di stringhe

    candaluar ha scritto:


    Durante le lezioni si possono fare delle domande? Io chiederei perchè si preferisce l'uso della fscanf() a fgets(). Comunque stiamo andando OT e chiudo qui
    Nessuno mi ha risposto sul perche' si mette ^[^ ,], e non ^[^ ,]

    Cioe se volessi escludere n caratteri dovrei ripeterli anche fuori dalle parentesi?
    es. ^[^ #,.:]#,.: ?
  • Re: Fscanf Separatore di stringhe

    Io ti ho suggerito di utilizzare fgets() e fare l'interpretazione della riga letta con strchr(): questo ti permette di fare qualsiasi cosa.
Devi accedere o registrarti per scrivere nel forum
10 risposte