C++ 逐行读取文本文件会使向量为空

C++ 逐行读取文本文件会使向量为空,c++,vector,text-files,ifstream,C++,Vector,Text Files,Ifstream,我正在尝试读取一个如下所示的文本文件: 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"

我正在尝试读取一个如下所示的文本文件:

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_名称;
ifstream myfile(“c:/temp/test.txt”);
如果(!myfile.is_open()){
库特
但是,您有一个问题,即您的
行计数方法已中断。最后一行不一定以
'\n'
结尾,只剩下一行

请注意,正如n.m.指出的那样,提前计算行数似乎毫无意义,因为
v_names.size()
稍后会提供相同的信息。也许您可以删除该代码,然后用这种方式解决问题

但是,您有一个问题,即您的
行计数方法已中断。最后一行不一定以
'\n'
结尾,只剩下一行


请注意,正如n.m.所指出的,提前计算行数似乎毫无意义,因为
v_names.size()
稍后将为您提供相同的信息。也许您可以删除该代码并以这种方式解决问题。

我不明白为什么您不能先读取行数,然后再进行计数

while (getline(myfile, line)){
    v_names.push_back(line);
}

auto line_count = v_names.size();
再说一次,因为
.size()
不会消失,所以只要你想知道你有多少个名字就随时调用它


旁注:计数
'\n'
s的数量并不保证始终有效,因为最后一行不一定以换行结束。

我不明白为什么不能先读取行,然后再计数

while (getline(myfile, line)){
    v_names.push_back(line);
}

auto line_count = v_names.size();
再说一次,因为
.size()
不会消失,所以只要你想知道你有多少个名字就随时调用它


旁注:计算
'\n'
s的数量并不能保证一直有效,因为最后一行不一定以换行结束。

试试这个,试试这个,删除有问题的行会更容易。@n.m:哈,是的。我想我下意识地认为这是以后需要的,但仔细检查一下这看起来确实毫无意义。谢谢!就是这样。我想在代码的早期迭代中获得文本文件的行数,但最终我可以用v_names.size()来调用它。删除有问题的行会更容易一些。@n.m.:哈,是的。我想我下意识地认为它是以后需要的,但仔细检查后,它确实显得毫无意义。谢谢!就是这样。我想在代码的早期迭代中获得文本文件的行数,但最终我只能使用c所有这些都是v_names.size().“不是每一行都必须以换行符结尾”除了最后一行之外,它们还将以什么结尾is@BoundaryImposition“除了最后一行,那是”正是我的观点。一个接一个的错误并不有趣。内存分配器可能很好,可以分配2次幂的块,但某些数字会导致某些运行时错误。对不起,你认为这里会出现什么运行时错误?内存分配器与此有什么关系?最糟糕的情况是少一行“报告”在
line\u count
中,这不会导致对
v\u name
的访问溢出,如果这是你的意思的话。@boundary,你是对的。大脑在这里有一个错误。不是每一行都必须以新行结束。除了最后一行之外,他们还会以什么结束is@BoundaryImposition “除了最后一行“正是我的观点。逐个错误并不有趣。内存分配器可能很好,可以分配2次幂的块,但某些数字会导致某些运行时错误。对不起,您认为这里会出现什么运行时错误?内存分配器与此有什么关系?可能发生的最坏情况是少“报告”一行。”在
line\u count
中,这不会导致对
v\u name
的访问溢出,如果这是您的意思的话。@boundary,您是对的。大脑在这里出现了一个错误。
while (getline(myfile, line)){
    v_names.push_back(line);
}

auto line_count = v_names.size();