该代码应该打印字符串的一部分,它是最后一个字符,但是delimiter(:)之后的第二部分仅打印字符串而不是字符。为什么它不起作用,我该如何解决?
代码:
#include <stdio.h>
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
string info;
void PrintTextFile(){
ifstream myfile("example.txt");
if(myfile.is_open()){
while (getline(myfile, info, ':')){
cout << info << " " << info.back() << "\n";
}
myfile.close();
}
else {
cout << "Unable to open file.";
}
}
int main(int argc, char *argv[]) {
PrintTextFile();
return 0;
}
example.txt:
Left1:Right1
Left2:Right1
Left3:Right3
我的输出:
Left1 1
Right1
Left2 2
Right2
Left3 3
Right3
预期输出:
Left1 1
Right1 1
Left2 2
Right2 2
Left3 3
Right3 3
答案 0 :(得分:3)
这里的问题是,当您为getline
提供自己的定界符时,它将停止使用换行符作为定界符。这意味着在您的第一个循环中,您读入Left1:
,丢弃:
,而info
剩下Left1
。再次阅读第二次迭代,直到看到:
,因此您读入Right1\nLeft2:
,丢弃:
,将info
留给Right1\nLeft2
。
您需要做的是读入整行,然后使用字符串流将其解析出来
while (getline(myfile, info)){
stringstream ss(info)
while (getline(ss, info, ':') // this works now because eof will also stop getline
cout << info << " " << info.back() << "\n";
}
或者因为您知道只需要两个值,所以可以像读取行的每个部分一样获得它们
while (getline(myfile, info, ':')){
cout << info << " " << info.back() << "\n";
getline(myfile, info);
cout << info << " " << info.back() << "\n";
}