2016-08-10 2 views
0

Ich versuche, eine Datei zu analysieren. Ich verwende derzeit den folgenden Code, würde aber mag esVersuchen, scanf durch sstream zu ersetzen

unsigned int vertexIndex[3], uvIndex[3], normalIndex[3]; 
const char* cstring = line.c_str(); 
int matches = sscanf(cstring, "f %d/%d/%d %d/%d/%d %d/%d/%d\n", &vertexIndex[0], &uvIndex[0], &normalIndex[0], &vertexIndex[1], &uvIndex[1], &normalIndex[1], &vertexIndex[2], &uvIndex[2], &normalIndex[2]); 

Wenn ich mit einer sstream basierten Lösung versuchen, die folgenden ersetzen, erhalte ich unerwartete Ergebnisse

std::stringstream f(line); 
f >> vertexIndex[0] >> uvIndex[0] >> normalIndex[0] >> vertexIndex[1] >> uvIndex[1] >> normalIndex[1] >> vertexIndex[2] >> uvIndex[2] >> normalIndex[2]; 

Ich bin sicher, dass ich Missverständnis bin die Stream-Nutzung irgendwie ... jede Hilfe wäre toll!

+1

Wo berücksichtigen Sie das "f" und für die Schrägstriche? Ich sehe nicht, dass Sie irgendeinen Code dafür geschrieben haben. –

+1

(Um ganz ehrlich zu sein, sogar in C++ ist Ihre ursprüngliche Lösung wahrscheinlich in den meisten Fällen vorzuziehen.) –

+0

Mögliches Duplikat von [Lesen in einem bestimmten Format mit cin] (http://stackoverflow.com/questions/14901678/reading- In-a-specific-format-with-cin) –

Antwort

0

Es war ein einfacher Mangel an Verständnis. Die Lösung für mein spezielles Problem war:

std::stringstream ss(line.substr(2)); 
char throwaway; 
for (int i = 0; i < 3; i++){ 
    ss >> vertexIndex[i] >> throwaway >> uvIndex[i] >> throwaway >> normalIndex[i]; 
} 

Meine nächste Frage ist, warum das Folgende nicht funktioniert?

ss.ignore(std::numeric_limits<std::streamsize>::max(), '/'); 
ss >> vertexIndex[i] >> uvIndex[i] >> normalIndex[i];