2016-09-01 24 views
4

Я пытаюсь написать программу, где я читаю текстовый файл, а затем беру каждую строку в текстовом файле и сохраняю их в строковом векторе. Я думаю, что я могу открыть текстовый файл, но я заметил, что после того, как я открою текстовый файл, ничего после этого момента не будет выполнено. Например, у меня есть оператор cout в конце моей основной функции, которая выводится, когда я ввожу имя файла, который не существует. Однако, если я ввожу имя файла, я не получаю никакого вывода из последнего оператора 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; }

+4

'lines' - пустой вектор. 'lines [i]' недопустимо для любого значения 'i'. Ваша программа просто сработает. –

+8

[why' while (! MyFile.eof()) 'is wrong] (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – Barmar

+1

Вы пишите из границ вектора с помощью 'lines [i]' –

ответ

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 
} 

Как было отмечено в комментариях, наиболее вероятной причиной того, что ваша программа, кажется, «конец» преждевременно, что это сбой. std::getline в качестве второго аргумента ссылается на-string. В вашем коде ваш вектор пуст; поэтому lines[i] для любого i возвращает ссылку на недопустимую память. Когда getline пытается получить доступ к этой памяти, программа выйдет из строя.

Если вы хотите получить исключение, когда пытаетесь получить доступ к индексу за пределами диапазона vector, используйте lines.at(i) вместо lines[i].

2

Вам нужно использовать push_back(), потому что ваш начальный вектор пуст и вы не можете использовать индексы на пустом векторе. Если вы это сделаете, это приведет к неопределенному поведению.

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