Semplice C: Come faccio a scannerizzare queste informazioni correttamente?

1

OK questa è una domanda semplice ma per qualche ragione non riesco a farlo bene. Devo scansionare da un file centinaia di righe di codice e memorizzarlo in un array (che normalmente posso fare un buon lavoro con) tuttavia Ad un certo punto il codice specificherà un numero che corrisponde quindi al successivo batch di caratteri e galleggia andando in vari array.

Come so che non sto descrivendo questo correttamente ecco un esempio.

una riga del file che sto leggendo conterrà qualcosa di simile a questo.

0221 T 2 S P 850 150 0.90 0.75 500 24 2 2012 G A 7 9600.00 0.1 1000 Name_of_place

0104 L 1 F 400 1.00 0.75 500 24 2 2012 G A 7 9600.00 0.1 1000 Ballroom

il problema che sto riscontrando è Questa parte qui

0221 T 2 S P 850 150 0.90 0.75 500 24 2 2012 G A 7 9600.00 0.1 1000 Name_of_place

0104 L 1 F 400 1.00 0.75 500 24 2 2012 G A 7 9600.00 0.1 1000 Ballroom

Il resto dopo questo è in genere lo stesso identico, ma a questo punto il numero nella parte anteriore indica tutti i valori che stanno entrando. Sono quasi del tutto perso su come scrivere un modo per scansionarlo e archiviare i dati in array correttamente

    
posta Doc 22.03.2012 - 23:08
fonte

2 risposte

2

Un modo per farlo è scansionare ogni riga in un buffer di dimensioni appropriate usando fgets :

fgets(buffer, BufferSize, fp);

e quindi utilizza il tokenizzatore di string :

char* pch = strtok(buffer, " ");
venue.code = atoi(pch);
pch = strtok(NULL, " ");
venue.type = pch[0];
pch = strtok(NULL, " ");
venue.numberOfSeatingTypes = atoi(pch);

Una volta che hai afferrato le dimensioni dei bit variabili, puoi allora malloc di spazio per loro:

venue.seatingTypes = (char *)malloc(sizeof(char) * venue.numberOfSeatingTypes);
venue.seatingSize = (int *)malloc(sizeof(int) * venue.numberOfSeatingTypes);

E poi continua a utilizzare il tokenizzatore di stringa in un ciclo per ottenere i tipi di posti e le dimensioni variabili di ciascun tipo.

Tieni presente che il tokenizzatore di stringhe non è rientranti, quindi potresti stare meglio usando re versione centrale.

    
risposta data 23.03.2012 - 01:51
fonte
2

Dato che è orientato alla linea, inizierei leggendo una riga (ad es. con fgets ).

Quindi analizzerei i singoli elementi di una riga utilizzando sscanf . Almeno se sto capendo correttamente, è necessario eseguire la scansione dei primi tre (o così) campi, quindi in base al contenuto di (alcuni di?) Quelli, decidere come analizzare il resto della linea. Questo è, ancora una volta, abbastanza semplice. Basta leggere in N campi (N = 3, penso), quindi dovresti fare qualcosa del tipo:

switch (venue_type) {
    case 'S':
        // read whatever
    case 'F'
        // read stuff for ballroom
    case 'T':
        // read stuff for theater
}

Potrebbe essere più facile rileggere la riga dall'inizio per ogni tipo di luogo, piuttosto che cercare di continuare dopo il terzo (o così) campo che hai già letto.

    
risposta data 23.03.2012 - 03:05
fonte

Leggi altre domande sui tag