我正在尝试阅读如下文本文件:
Gate
People
Crab
Motorbike
我的代码是:
string line;
vector<string> v_names;
ifstream myfile("c:/temp/test.txt");
if (! myfile.is_open()) {
cout << "Failed to open" << endl;
}
else {
cout << "Opened OK" << endl;
}
myfile.unsetf(ios_base::skipws);
unsigned line_count = count(istreambuf_iterator<char>(myfile), istreambuf_iterator<char>(), '\n');
while (getline(myfile, line)){
v_names.push_back(line);
}
如果我想用v_names.size()
获取矢量的大小,则返回0.如果我调用v_names[0]
,我会收到错误“矢量下标超出范围”
我做错了什么?
答案 0 :(得分:4)
unsigned line_count = count(istreambuf_iterator<char>(myfile), istreambuf_iterator<char>(), '\n');
这里您使用了流中的所有数据。之后,没有剩余数据。因此,getline
次呼叫无需循环播放。
由于它是一个文件流,你可以&#34;寻找&#34;回到文件的开头并再次开始使用所有数据:
unsigned line_count = count(
istreambuf_iterator<char>(myfile),
istreambuf_iterator<char>(),
'\n'
);
myfile.seek(0, std::ios_base::beg);
myfile.clear();
while (getline(myfile, line)) {
v_names.push_back(line);
}
但是,您遇到了问题,即您的line_count
方法已被破坏。最后一行不一定以'\n'
结尾,让你一个人离开。
请注意,正如我。指出,提前计算线条似乎毫无意义,因为v_names.size()
稍后会给你相同的信息。也许你可以删除那些代码并以这种方式解决问题。
答案 1 :(得分:1)
我不明白为什么你不能先读行,然后计算它们。
while (getline(myfile, line)){
v_names.push_back(line);
}
auto line_count = v_names.size();
然后再次,因为.size()
没有走开,只要你知道你有多少名字,就打电话给它。
SIDE注意:计算'\n'
的数量不能保证一直有效,因为最后一行不一定以换行符结束。