用c ++我读了一个文件
a;aa a;1
b;b bb;2
并使用此代码分割线条
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
vector<string> split(string str, string separator)
{
int found;
vector<string> results;
found = str.find_first_of(separator);
while(found != string::npos) {
if(found > 0) {
results.push_back(str.substr(0,found));
}
str = str.substr(found+1);
found = str.find_first_of(separator);
}
if(str.length() > 0) {
results.push_back(str);
}
return results;
}
void lectura()
{
ifstream entrada;
string linea;
vector<string> lSeparada;
cout << "== Entrada ==" << endl;
entrada.open("entrada.in");
if ( entrada.is_open() ) {
while ( entrada.good() ) {
getline(entrada,linea);
cout << linea << endl;
lSeparada = split(linea,";");
cout << lSeparada[0] << endl;
}
entrada.close();
}
exit(0);
}
但是我在输出中得到了垃圾
== Entrada ==
a;aa a;1
a
b;b bb;2
b
b a;11?E????aa a!(GXG10F????11?GXGb bb;21F????b bb!?G1?F????2??
为什么我会得到这个垃圾?
答案 0 :(得分:2)
您对getline
的最后一次通话留空linea
。如果输入空行,split
将返回空向量(测试length() > 0
将为false)。尝试取消引用第一个元素(lSeparada[0]
)然后调用未定义的行为。
可能输入文件不包含空行,但最后一次调用getline()
将失败。您应该使用istream&
而不是std::getline()
来测试 while(getline(entrada,linea))
返回的while(entrada.good()) getline(entrada,linea)
是否良好。这可能会解决您的问题。
答案 1 :(得分:0)
我注意到的一个问题是您可能想要使用:
results.push_back(str.substr(0, found - separator.length()));
在split()
中,以便分隔符字符串不包含在您的输出中。