Последнее слово в строке не читается - PullRequest
0 голосов
/ 16 мая 2009

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

Так что в основном мой код выглядит так

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main(int argv, char **argc)
{
  ifstream fin(argc[1]);
  char delimiter[] = "|,.\n ";
  string sentence;

  while (getline(fin,sentence)) {
     int pos;
     pos = sentence.find_first_of(delimiter);
     while (pos != string::npos) {
        if (pos > 0) {
           cout << sentence.substr(0,pos) << endl;
        }
          sentence =sentence.substr(pos+1);
          pos = sentence.find_first_of(delimiter);
      }
  }
}

Однако мой код не прочитал последнее слово в строке. Например, мой файл выглядит следующим образом. Привет, мир

вывод из программы только слово "привет", но не "мир". Я использовал '\ n' в качестве разделителя, но почему он не работает?

Любая подсказка будет оценена.

Ответы [ 3 ]

2 голосов
/ 16 мая 2009

Перефразируя этот справочный документ :

Символы извлекаются до тех пор, пока символ-разделитель (\n) не будет найден, отброшен и оставшиеся символы возвращены.

Ваша строка не заканчивается \n, это ^`hello world`$, поэтому разделитель или новая позиция не найдены.

2 голосов
/ 16 мая 2009

getline не сохраняет символ новой строки в строке. Например, если в вашем файле есть строка "Hello World \ n" getline будет читать эту строку "Hello World \ 0" Таким образом, ваш код пропускает "Мир".

Игнорирование этого предложения не определено, вы можете изменить код так, чтобы он работал следующим образом:

#include<iostream>
#include<fstream>
using namespace std;

int main(int argv, char *argc)
{
  ifstream fin(argc[1]);
  char delimiter[]="|,.\n ";
  while (getline(fin,sentence)) {
     sentence += "\n";
     int pos;   
     pos = find_first_of(sentence,delimiter);
     while (pos != string:: npos) {
        if (pos > 0) {
           cout << sentence.substr(0,pos) << "\n";
        }
          sentence =sentence.substr(pos+1);
          pos = find_first_of(sentence,delimiter);
      }
  }
}

Обратите внимание, я позаимствовал у Билла Ящеров более изящное решение добавления последнего разделителя. В моей предыдущей версии было условие выхода из цикла.

1 голос
/ 16 мая 2009

Как уже упоминалось, getline не возвращает символ новой строки в конце. Самый простой способ исправить ваш код - добавить один в конец предложения после вызова getline.

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main(int argv, char **argc)
{
  ifstream fin(argc[1]);
  char delimiter[] = "|,.\n ";
  string sentence;

  while (getline(fin,sentence)) {
     sentence += "\n";
     int pos;
     pos = sentence.find_first_of(delimiter);
     while (pos != string::npos) {
        if (pos > 0) {
           cout << sentence.substr(0,pos) << endl;
        }
          sentence =sentence.substr(pos+1);
          pos = sentence.find_first_of(delimiter);
      }
  }
}
...