Почему stringstream прекращает получать строки?[C ++] - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь реализовать способ чтения входных данных из текстовых файлов, чтобы упростить загрузку различных наборов координат, но я наткнулся на ошибку, которую не понимаю, когда мой объект stringstream перестанет получать строкиоднажды одна строка плохо отформатирована.

В моем выводе вы можете видеть, что строка все еще не повреждена, когда распечатывается, а затем помещается в stringstream на следующей строке, но после одной плохо отформатированной строки, stringstream перестает содержать что-либо, когда я распечатываю это.

Что здесь происходит?

Вывод:

image

Вот как выглядит текстовый файл:

image

Код метода:

ifstream pathfile(p.string());
cout << "Path file opened successfully.\n\n";

string line;
stringstream ss;
int x, y;
char comma,direction;

//Iterate all lines in the file
while(getline(pathfile,line)){
  //remove all spaces from line
  line.erase(remove(line.begin(), line.end(), ' '), line.end());
  //skip comments and blank lines
  if(line.c_str()[0] == '#' || line.empty()) continue;
  //parse remaining lines
  ss.str(string()); //clear stringstream
  cout <<"LINE: "<<line<<endl;
  ss << line;
  cout <<"SS: "<<ss.str()<<endl;

  if(ss >> x >> comma >> y >> comma >> direction)
    cout << "X: "<<x<<"  Y: "<<y<<"  D: "<<direction;
  else{
    cout << "Ill-formatted line: ";
  }
  printf(" |  %s\n\n", line.c_str());
}
pathfile.close();

1 Ответ

0 голосов
/ 16 февраля 2019

Поскольку поток переходит в состояние ошибки, когда ему не удается прочитать целое число, вам необходимо очистить состояние ошибки.Для этого:

ss.clear();

Гораздо проще сделать, просто переместив определение потока строк в цикл:

istringstream ss(line);
if(ss >> x >> comma >> y >> comma >> direction)
    // ...
...