Leggere un file riga per riga e dividere la stringa in token in c

Sto leggendo un file riga per riga e dividere la stringa in token.

int main()
{
    FILE* fp;
    char  line[255];

    fp = fopen("file.txt" , "r");
    while (fgets(line, sizeof(line), fp) != NULL)
    {   
        char val1[16];
        char val2[9];

        strcpy(val1, strtok(line, ","));
        strcpy(val2, strtok(NULL, ","));

        printf("%s|%s\n", val1, val2);          
    }
}

Mio file di input di contenuti (file.txt)

182930101222, KLA1512
182930101223, KLA1513
182930101224, KLA1514
182930101225, KLA1515

Quando si stampa ottenere

 | KLA1512

Invece di

182930101222| KLA1512

Qual è il problema ?

eseguire il debug del codice stampa line prima strcpy chiamate per sapere perché val1 è \0.
Sembra venuto il momento di imparare ad usare un debugger.
stackoverflow.com/q/18420057/905902 (stesso ma senza il loop)
Ma poi non ha avuto il “\n” alla fine della stringa. (o forse anche “\r\n” )
In realtà, il tuo codice funziona per me.

OriginaleL’autore | 2013-08-24

2 Replies
  1. 5

    Il tuo problema (di nuovo) è che non sei l’allocazione di spazio sufficiente per una matrice, e sovrascrivere la fine di esso. L’ironia è che in questo caso non c’è nemmeno bisogno di allocare eventuali (ulteriori) le matrici. strtok() è la creazione di token il line[] array, sovrascrivendo i delimitatori con '\0' caratteri, e coloro che sono sufficienti per le vostre esigenze.

    int main()
    {
        FILE* fp;
        char  line[255];
    
        fp = fopen("file.txt" , "r");
        while (fgets(line, sizeof(line), fp) != NULL)
        {
            const char* val1 = strtok(line, ",");
            const char* val2 = strtok(NULL, ",");
    
            printf("%s|%s\n", val1, val2);
        }
    }
    può come rimuovere il carattere di a capo e gli spazi da char array in c.
    Rimuovere e finale spazi modellabile char buffer non è difficile a tutti. Potrei scrivere la funzione & post-it per voi, ma come sarebbe che consentono di imparare? Il line[255] buffer è modificabile dall’utente in qualsiasi modo si vede in forma. Hai già la modifica, chiamando strtok() su di esso (sovrascrivendo il ',' delimitatori con caratteri nul ('\0') che trasforma il buffer in separata di tipo C le stringhe, che consente di tenere traccia di con puntatori val1 e val2). Ora, scrivi una nuova funzione, proprio per rimuovere leader & finali spazi….
    Una opportuna funzione di firma sarebbe: char* remove_whitespace(char* str). Con la firma della funzione, si prende un C-stile puntatore alla stringa, la funzione di modifica stringa, come necessario, e restituisce un puntatore alla stessa stringa con spazi rimosso. Se non c’è spazio all’inizio, ti basta restituire il puntatore stesso indirizzo che è stato passato. Nella funzione loop dall’inizio fino a che non e ‘ un carattere di spaziatura (vedi isspace()). Quando lo hai trovato, questo è il nuovo inizio della stringa (che è necessario tenere traccia di un puntatore, perché il puntatore di ritorno.)
    Quindi mantenere il ciclo fino a quando si trova la fine della stringa (cioè fino a quando si incontra la terminazione '\0' carattere). Quindi eseguire la scansione indietro fino a trovare il primo non-carattere di spaziatura, o si inizia indirizzo del puntatore (in ogni modo). Quando la si trova, è sufficiente scrivere '\0' all’indirizzo di uno più grande di quella, che termina la stringa in quel punto (troncamento di eventuali spazi, che include caratteri di nuova riga).
    BTW, se hai trovato una risposta a questa pagina per essere utile, si prega di selezionare come “il migliore” risposta. Ecco come si “paga” le persone per aiutarvi. Anche, in alternativa, votare tutte le risposte che sono stati utili, anche se non selezionare come “il migliore” risposta.

    OriginaleL’autore phonetagger

  2. 0

    fgets inserisce una nuova riga

    semplicemente aumentare val2 dimensioni di 1, cioè val2[10]

    o rimuovere finale '\n'

    while( fgets(line, sizeof(line), fp) != NULL ){ 
            char val1[16] ,val2[9];
            char *pos;
            if ((pos=strchr(line, '\n')) != NULL)
                *pos = '\0';
            strcpy(val1 , strtok(line,","));
            strcpy(val2 , strtok(NULL,","));
            printf("%s|%s\n",val1, val2);           
    }

    OriginaleL’autore P0W

Lascia un commento