排队的最后一个字不读

时间:2009-05-16 15:44:14

标签: c++ delimiter line-endings delimited-text

我目前正在开发一个程序,它从文件中读取每一行,并使用特定的分隔符从行中提取单词。

基本上我的代码看起来像这样

#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);
      }
  }
}

但是我的代码没有读到该行中的最后一个字。例如,我的文件看起来像这样。 你好世界

程序的输出只是单词“hello”而不是“world”。我使用'\ n'作为分隔符,但为什么它不起作用?。

任何暗示都会受到赞赏。

3 个答案:

答案 0 :(得分:2)

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 :(得分:2)

释义this reference document

提取字符,直到找到分隔符(\n),丢弃并返回剩余的字符。

您的字符串不以\n结尾,而是^`hello world`$,因此找不到分隔符或新pos。

答案 2 :(得分:1)

正如其他人所提到的,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);
      }
  }
}