[Risolto][C] Estrazione di nomi da file con strtok

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
cnf

[Risolto][C] Estrazione di nomi da file con strtok

Messaggio da cnf »

Ciao a tutti.

Supponiamo di avere il file fileditesto.txt

Codice: Seleziona tutto

MARIO_1
PAOLO_2
MARCO_3
ROSSI 1
VERDI 2
BIANCHI 3
e il codice

Codice: Seleziona tutto

#include <stdio.h>
#include <string.h>

int main(void)
{
    FILE * pFI;
    char   line[82];
    char   outputfilename[82];
    int    k = 0;

    pFI = fopen( "fileditesto.txt", "r");
    if ( NULL == pFI ) {
        perror("Error in opening file");
        return 1;
    }

    k = 0;
    for ( k = 0; k < 2; k++ )   /* legge due linee */
        fgets(line, sizeof line, pFI);

    char * str1 = strtok(line, " 0123456789");

    k = 0;
    for ( k = 0; k < 3; k++ )   /* legge tre linee */
        fgets(line, sizeof line, pFI);

    char * str2 = strtok(line, " 0123456789");

    strcpy( outputfilename, str1   );
    strcat( outputfilename, str2   );
    strcat( outputfilename, ".txt" );

    puts(outputfilename);

    return 0;
}
Così come scritto credevo di ottenere in output la stringa

Codice: Seleziona tutto

PAOLO_VERDI.txt
invece ottengo

Codice: Seleziona tutto

VERDIVERDI.txt
Dove e cosa sbaglio? Grazie.
Ultima modifica di cnf il lunedì 29 giugno 2015, 22:33, modificato 1 volta in totale.
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: [C] Estrazione di nomi da file con strtok

Messaggio da 1001001 »

Occhio a strtok e soprattutto a cosa restituisce: http://www.cplusplus.com/reference/cstr ... ?kw=strtok

str1 è un puntatore allo stesso indirizzo di line, quindi poi la chiamata a fgets successiva modifica anche line, così come l'ultima chiamata a strtok
"I find your lack of faith disturbing."
cnf

Re: [C] Estrazione di nomi da file con strtok

Messaggio da cnf »

Grazie delle indicazioni.

Cercherò di trovare una soluzione diversa, che al momento non mi viene. Nel caso tornerò a scrivere.
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: [C] Estrazione di nomi da file con strtok

Messaggio da 1001001 »

Basta copiare l'output di strtok in str1 e str2 (allocate in precedenza), invece di assegnarlo direttamente ;)
"I find your lack of faith disturbing."
cnf

Re: [C] Estrazione di nomi da file con strtok

Messaggio da cnf »

Questa soluzione fa quello che deve fare sulla base di quello che mi hai suggerito

Codice: Seleziona tutto

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    FILE * pFI;
    char   line[82];
    char   outputfilename[82];
    int    k = 0;
    char * buffer;
    char * str1 = malloc( sizeof (char) );
    char * str2 = malloc( sizeof (char) );

    pFI = fopen( "fileditesto.txt", "r");
    if ( NULL == pFI ) {
        perror("Error in opening file");
        return 1;
    }

    for ( k = 0; k < 2; k++ )   /* legge due linee */
        fgets(line, sizeof line, pFI);

    buffer = strtok(line, " 0123456789");
    strcpy(str1, buffer);

    for ( k = 0; k < 3; k++ )   /* legge tre linee */
        fgets(line, sizeof line, pFI);

    buffer = strtok(line, " 0123456789");
    strcpy(str2, buffer);

    strcpy( outputfilename, str1   );
    strcat( outputfilename, str2   );
    strcat( outputfilename, ".txt" );

    puts(outputfilename);

    return 0;
}
È corretto come codice oppure ha delle controindicazioni? Grazie.
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: [C] Estrazione di nomi da file con strtok

Messaggio da 1001001 »

Mi sembra corretto. L'unico problema è che hai usato

Codice: Seleziona tutto

char * str1 = malloc( sizeof (char) );
char * str2 = malloc( sizeof (char) );
cosa che ti crea l'equivalente in memoria dinamica di

Codice: Seleziona tutto

char str1[1]);
char str2[1];
(cioè due stringhe di dimensione 1).

Devi invece fare:

Codice: Seleziona tutto

char * str1 = malloc( dimensione1 * sizeof (char) );
char * str2 = malloc( dimensione2 * sizeof (char) );
con dimensione1 e dimensione2 valori che devi decidere tu.

Nel tuo caso non vedevi problemi perché per una botta di fortuna la memoria dopo str1 e str2 era libera e il programma ha potuto usarla, ma in generale se salvi una stringa di una certa dimensione in una locazione di memoria di dimensione più piccola sei a rischio segmentation fault
"I find your lack of faith disturbing."
cnf

Re: [C] Estrazione di nomi da file con strtok

Messaggio da cnf »

Grazie mille. Più in la studierò meglio/bene l'uso e l'utilità di malloc. Tra qualche giorno vorrei studiare anche qualche altra soluzione di questo problema a partire sempre dalle tue indicazioni. Grazie ancora.
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: [C] Estrazione di nomi da file con strtok

Messaggio da 1001001 »

Ok, se hai altri problemi chiedi pure!
"I find your lack of faith disturbing."
cnf

Re: [C] Estrazione di nomi da file con strtok

Messaggio da cnf »

Ecco una variante del codice.

Codice: Seleziona tutto

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    FILE * pFI;
    char   line[82];
    char   outputfilename[40];
    int    k = 0;
    char * buffer;

    pFI = fopen( "fileditesto.txt", "r");
    if ( NULL == pFI ) {
        perror("Error in opening file");
        return 1;
    }

    for ( k = 0; k < 2; k++ )   /* legge due linee */
        fgets(line, sizeof line, pFI);

    buffer = strtok(line, " 0123456789");
    strcpy(outputfilename, buffer);

    for ( k = 0; k < 3; k++ )   /* legge tre linee */
        fgets(line, sizeof line, pFI);

    buffer = strtok(line, " 0123456789");
    strcat(outputfilename, buffer);

    strcat(outputfilename, ".txt" );
    puts(outputfilename);

    return 0;
}
Ho cercato di evitare l'uso di malloc; da quel poco che ho potuto leggere mi è parso di capire che vada evitata. È corretto? Suggerimenti?

Grazie mille.
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: [C] Estrazione di nomi da file con strtok

Messaggio da 1001001 »

Mi sembra che vada bene
"I find your lack of faith disturbing."
cnf

Re: [C] Estrazione di nomi da file con strtok [RISOLTO]

Messaggio da cnf »

Grazie. Aggiunto risolto.
Avatar utente
jackynet92
Moderatore Globale
Moderatore Globale
Messaggi: 13413
Iscrizione: sabato 3 settembre 2011, 1:41
Desktop: Mate
Distribuzione: Ubuntu 16.04 64bit
Sesso: Maschile
Località: Torino

Re: [C] Estrazione di nomi da file con strtok [RISOLTO]

Messaggio da jackynet92 »

Meglio se messo all'inizio del titolo invece che alla fine
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: Google [Bot] e 6 ospiti