2016-10-30 4 views
0

Ich lese in einer Datei und habe eine Sentinel in der Mitte dieser .dat-Datei. Der erste Teil sind Variablen und der Wert, den sie zugewiesen werden sollen. Ich bekomme die Variable und ihren Wert gut. Hier ist was ich habe.Infile mit eof und sentinel

int main() { 
ifstream infile; 
string variable; 
int value; 

infile.open("test.dat"); 

while (infile.peek() != EOF) { 

    infile >> variable; 
    infile >> value; 

} 



return 0; 
} 

und hier ist die .dat-Datei

f 32 
h 3 
l -2 
q 3 
v 5 
$ 
lqv 
hfv 
vvf 
vfl 

Mein erster Gedanke zu While-Schleifen zu verwenden ist. Das war while (variable != "$"), aber wenn ich das mache, werde ich in eine Endlosschleife versetzt. So bin ich völlig verloren, wie man Variablen bekommt und zuweist und dann den Rest der .dat-Datei bekommt.

Ich musste dies etwas ändern, weil ich die Variablen nicht hart codieren möchte. Ich werde 2 Schleifen verwenden. Einer vor dem $ und einer nach dem $. wenn ich versuche while (infile != "$") bekomme ich eine Endlosschleife.

Antwort

0

Sie können

while (infile.peek() != EOF) { 
    infile >> variable; 
    infile >> value; 
    ... 
} 

von

while (infile.good()) { 
    infile >> variable; 
    if (variable != "$" && variable.length() > 0) { 
     infile >> value; 
     switch (variable[0]) { 
      ... 
     } 
    } 
    else 
     break; 
} 

ersetzen Dies sollte Endlosschleife vermeiden.

1

schlage ich die folgende, in der ersten Variablennamen lesen und, wenn notwendig, den Wert lesen:

while (infile >> variable) 
{ 
    if (variable != "$") 
    { 
    infile >> value; 
    } 
    else 
    { 
    break; 
    } 
} 

Ein std::map ist sehr nützlich für Variablennamen auf Werte zuordnet:

std::map<std::string, double> dictionary; 
while (infile >> variable) 
{ 
    if (variable != "$") 
    { 
    infile >> value; 
    dictionary[variable] = value; 
    } 
    else 
    { 
    break; 
    } 
} 

Die Syntax infile >> variable ist eine zuverlässigere Methode zum Lesen aus einer Datei.

0

Sie können prüfen, ob das nächste Zeichen '$' oder EOF ist, aber nach ">>" müssen Sie ein get für das \ n hinzufügen.

ifstream file("test.dat"); 
    int value; 
    string variable; 
    while(file.peek() != '$') 
    { 
      file >> variable; 
      file >> value; 
      while(file.get() != '\n' && file.good()); // '\n' 
      if(!file.good()) break; 
    } 

Dies funktioniert nur, wenn Sie wirklich wissen, die Struktur der Datei, andernfalls sollten Sie Zeile lesen und scannen, was für das, was Sie brauchen.