我目前正在开发一个程序,它从文件中读取每一行,并使用特定的分隔符从行中提取单词。
基本上我的代码看起来像这样
#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'作为分隔符,但为什么它不起作用?。
任何暗示都会受到赞赏。
答案 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)
提取字符,直到找到分隔符(\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);
}
}
}