Frage

Ich bin Parsen einer Datei, die beide Strings und numerische Werte enthält. Ich möchte das Datei Feld für Feld verarbeiten, begrenzt jeweils durch einen Raum oder einen End-of-Line-Charakter. Die ifstream :: getline () Betrieb ermöglicht nur ein einziges Trennzeichen. Was ich zur Zeit ist also ein getline mit dem Zeichen ‚‘ als Trennzeichen, und dann manuell in die vorherige Position im Strom zurückgehen, wenn ein ‚\ n‘ aufgetreten ist:

 ifstream ifs ( filename , ifstream::in );
 streampos pos;
 while (ifs.good())
 {  
  char curField[255];  

  pos = ifs.tellg();
  ifs.getline(curField, 255, ' '); 
  string s(curField);
  if (s.find("\n")!=string::npos) 
  {   
   ifs.seekg(pos); 
   ifs.getline(curField, 255, '\n'); 
   s = string(curField);
  }

 // process the field contained in the string s...
 }

Doch die „seekg“ scheint den Strom ein Zeichen zu positionieren zu spät (ich vermisse also das erste Zeichen jedes Feldes vor jeder Zeilenumbruch). Ich weiß, es gibt auch andere Möglichkeiten, um Code, wie ein Parser, durch Zeilenabtastung durch die Linie etc .., aber ich mag wirklich zu verstehen, warum dieses besondere Stück Code nicht ...

Vielen Dank!

War es hilfreich?

Lösung

Wie gesagt Loadmaster gibt es für Zeichen sein nachgewiesenes kann, oder könnte dies nur ein Off-by-one Fehler sein.

Aber das hat nur gesagt werden, ... Sie können diese ersetzen:

 ifstream ifs ( filename , ifstream::in );
 streampos pos;
 while (ifs.good())
 {  
  char curField[255];  

  pos = ifs.tellg();
  ifs.getline(curField, 255, ' '); 
  string s(curField);
  if (s.find("\n")!=string::npos) 
  {   
   ifs.seekg(pos); 
   ifs.getline(curField, 255, '\n'); 
   s = string(curField);
  }

 // process the field contained in the string s...
 }

Mit diesem:

 ifstream ifs ( filename , ifstream::in );
 streampos pos;
 string s;
 while (ifs.good())
 {  
   ifs >> s;
   // process the field contained in the string s...
 }

Um das Verhalten Sie wollen.

Andere Tipps

Es kann ein Vorgriff / Push-Back-Zeichen in dem Eingangsstrom sein. IIRC, die Such / tell Funktionen nicht bewusst sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top