2010-07-22 7 views
12

Ich versuche, in einem bestimmten Teil einer Datei einzulesen und diese Menge an Daten ist unterschiedlich pro Zeile, aber ich weiß, wie viele Bytes von Informationen ich will. Wie folgt aus:Breite als Variable bei der Verwendung von fscanf

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

Aktuelle Daten:

05AABBCCDDEE11 
03AABBCC22 
04AABBCCDD33 

Deshalb möchte ich meine Breite haben sein eine Variable wie folgt aus:

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

Ist dies möglich, weil im Moment bin ich Ich denke, ich muss eine Fallaussage erstellen?

+1

Sie müssen klären, was Sie fragen. –

+0

im Grunde möchte ich nur in der Lage sein, die Breite mit einer Variablen zu setzen, die ich pro Zeile anstelle von "% 5X" ändern kann - hier bin ich auf eine Breite von 5 begrenzt, ich möchte nur meine eigene Variable in setzen Da kann meine Breite also dynamisch sein. –

Antwort

10

Leider nein, es gibt keinen Modifikator wie '*' für printf, der bewirkt, dass scanf seine Feldbreite oder Genauigkeit von einer Variablen erhält. Die nächstgelegene Sie kommen kann, ist die Erstellung dynamisch die Format-String:

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

Sie haben in + Datei, das sollte in_file sein. – SCFrench

0

fscanf mit% X wird automatisch an einem Newline stoppen, oder? Wenn die Felder wirklich Newline-terminierte (wie in Ihrem Beispiel), dann können Sie nicht einfach anrufen

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

und lassen fscanf herauszufinden, wo das Ende ist?

+0

Ja, das ist richtig Ich habe tatsächlich einen Fehler gemacht, es gibt eine Prüfsumme am Ende, die ich nicht will. Also würde das nicht für mich funktionieren. –

0

Sie könnten auch ++ Streams mit C betrachten.

#include <ifstream> 
#include <iostream> 

// open the file and create a file input stream 
ifstream file("test.txt" , ios::in | ios::binary); 

// loop through the whole file 
while (ifs.good()) 
{ 
    // extract one byte as the field width 
    unsigned char width; 
    file.read(&width, 1); 

    // extract width number of unformatted bytes 
    char * bytes = new char[width]; 
    file.read(bytes, width); 

    // process the bytes 
    ... 
    delete [] bytes; 

    // skip EOL characters if needed 
    // file.seekg(1, ios_base::cur) 
} 

file.close(); 

Ein einfacher Weg, wenn die Zeilenumbrüche enthalten sind, wie Sie scheinen, wäre getLine() zu verwenden. Check out http://www.cplusplus.com/reference/iostream/ifstream/ für mehr Möglichkeiten zu lesen(), get(), getLine() und viele andere große Stream-Funktionen.

0

ich denke, die einfachste fread() wie folgt zu verwenden wäre:

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

Wenn Sie wirklich das fscanf Format in der Lage sein wollen programmatisch einstellen, könnten Sie versuchen Stack-Zuweisung eines Strings mit genügend Platz und dann das Format wie folgt erzeugen: z

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... 
Verwandte Themen