0

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

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

#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' 作为分隔符,但为什么它不起作用?

任何提示将不胜感激。

4

3 回答 3

2

getline 不会在字符串中保存换行符。例如,如果您的文件包含“Hello World\n”行,getline 将读取此字符串“Hello World\0”,因此您的代码会丢失“World”。

忽略未定义的那句话,您可以更改代码以使其像这样工作:

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

请注意,我借用了 Bill the Lizards 更优雅的附加最后一个分隔符的解决方案。我以前的版本有一个循环退出条件。

于 2009-05-16T15:57:34.917 回答
2

解释这个参考文件

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

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

于 2009-05-16T15:58:15.943 回答
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);
      }
  }
}
于 2009-05-16T16:30:03.603 回答