2010-07-22 25 views
12

Sto provando a leggere in una certa parte di un file e quella quantità di dati è diversa per linea, ma so quanti byte di informazioni voglio. Come questo:Larghezza come variabile quando si utilizza fscanf

5bytes.byte1byte2byte3byte4byte5CKSum //where # of bytes varies for each line (and there is no period only there for readability) 

dati effettivi:

05AABBCCDDEE11 
03AABBCC22 
04AABBCCDD33 

quindi voglio avere la mia larghezza di una variabile in questo modo:

fscanf_s(in_file,"%variableX", &iData); 

questo è possibile, perché in questo momento sto pensando di dover creare una dichiarazione di un caso?

+1

È necessario chiarire cosa stai chiedendo. –

+0

in pratica voglio solo essere in grado di impostare la larghezza con una variabile che posso cambiare per ogni riga che ho letto al posto di "% 5X" - non sono limitato a una larghezza di 5, voglio solo mettere la mia variabile in lì così la mia larghezza può essere dinamica. –

risposta

10

Sfortunatamente no, non esiste alcun modificatore come "*" per printf che fa sì che scanf ottenga la larghezza o la precisione del campo da una variabile. Il più vicino possibile è creare dinamicamente la stringa di formato:

char format[8]; 
sprintf(format, "%%%dX", width); 
fscanf(in_file, format, &iData); 
+0

Hai + file, che dovrebbe essere in_file. – SCFrench

0

fscanf con% X si fermerà automaticamente su una nuova riga, giusto? Se i campi sono davvero a capo terminali (come nel tuo esempio), allora può non basta chiamare

fscanf(in_file, "%X", &iData); 

e lasciare fscanf capire dove finale è?

+0

Sì, sì, in realtà ho commesso un errore, alla fine c'è un checksum che non voglio. Quindi questo non funzionerebbe per me. –

0

Si potrebbe anche considerare l'utilizzo di flussi C++.

Un modo più semplice se le newline sono incluse come sembra indicare, sarebbe utilizzare getLine(). Controlla http://www.cplusplus.com/reference/iostream/ifstream/ per altri modi di usare read(), get(), getLine() e molte altre grandi funzioni di streaming.

0

penso che il più semplice sarebbe quella di utilizzare fread() come questo:

fread(buffer, nbytes, sizeof(char), in_file); 
1

Se davvero si vuole essere in grado di regolare il formato fscanf a livello di codice, si potrebbe provare a pila-allocare una stringa con spazio sufficiente e quindi generare il formato in questo modo: es.

char formatString[100]; 

// writes "%max_size[0-9]", substituting max_size with the proper digits 
sprintf(formatString, "%%%d[0-9]", MAX_SIZE); 

fscanf(fp, formatString, buffer); // etc... 
Problemi correlati