анализ потока - PullRequest
       41

анализ потока

1 голос
/ 06 октября 2010

Я анализирую файл, который содержит как строки, так и числовые значения. Я хотел бы обрабатывать файл поле за полем, каждый из которых разделен пробелом или символом конца строки. Операция ifstream :: getline () допускает только один символ-разделитель. Таким образом, в настоящее время я делаю строку getline с символом '' в качестве разделителя, а затем вручную возвращаюсь к предыдущей позиции в потоке, если встречается '\ n':

 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...
 }

Однако «seekg», кажется, позиционирует поток на один символ слишком поздно (поэтому я пропускаю первый символ каждого поля перед каждым переводом строки). Я знаю, что есть другие способы кодирования такого парсера, сканируя построчно и т. Д., Но мне бы очень хотелось понять, почему этот конкретный фрагмент кода не работает ...

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 06 октября 2010

Как сказал Loadmaster, символы могут быть не учтены, или это может быть просто ошибкой.

Но это просто нужно сказать ... вы можете заменить это:

 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...
 }

С этим:

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

Чтобы получить желаемое поведение.

0 голосов
/ 06 октября 2010

Во входном потоке может быть символ упреждения / возврата.IIRC, функции поиска / сообщения не знают об этом.

...