打开文本文件后为什么不打印我的cout语句?

时间:2016-09-01 04:48:06

标签: c++ ifstream cout

我正在尝试编写一个程序,我在其中读取文本文件,然后在文本文件中取出每一行并将它们存储在字符串向量中。我想我能够打开文本文件,但是我注意到在打开文本文件后,该点之后的任何内容都没有执行。例如,我在main函数末尾有一个cout语句,当我输入不存在的文件名时输出。但是,如果我输入文件名确实存在,我从最后一个cout语句得不到输出。有谁知道这是为什么?谢谢!

int main() { vector<string>line; string fileName = "test.txt"; ifstream myFile(fileName.c_str()); int i = 0; int count = 0; vector<string>lines; cout << "test" << endl; if (myFile.is_open()) { cout << "test2" << endl; while (!myFile.eof()) { getline(myFile, lines[i],'\n'); i++; } myFile.close(); } if (!myFile.is_open()) { cout<< "File not open"<< endl; } myFile.close(); cout << "Test3" <<endl; return 0; }

2 个答案:

答案 0 :(得分:4)

尝试this

string fileName = "test.txt";
ifstream myFile(fileName); // .c_str() not needed - ifstream can take an actual string
vector<string> lines;

string line; // temporary variable for std::getline
while (getline(myFile, line)) {
   lines.push_back(line); // use push_back to add new elements to the vector
}

正如评论中所指出的,最可能的原因是你的计划似乎已经结束了#34;过早的是,它崩溃了。 std::getline将引用 - string作为其第二个参数。在你的代码中,你的向量是空的;因此,任何lines[i]的{​​{1}}都会返回对无效内存的引用。当i尝试访问该内存时,程序崩溃。

如果您想在尝试访问getline的越界索引时抛出异常,请使用lines.at(i)代替lines[i]

答案 1 :(得分:2)

您需要使用push_back(),因为您的初始向量为空,并且您不能在空向量上使用索引。如果这样做,将导致未定义的行为。

std::ifstream input( "filename.ext" );
std::vector<std::string> lines;
for( std::string line; getline( input, line ); )
{
    lines.push_back(line); 
}