2016-09-01 2 views
4

私はテキストファイルを読み込んだ後、テキストファイルの各行を取り出して文字列ベクトルに格納するプログラムを作成しようとしています。私はテキストファイルを開くことができると思うが、私はそのポイントが実行されていない後にテキストファイルを開いた後に気づいた。たとえば、存在しないファイルの名前を入力するときに出力するmain関数の最後に、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

[なぜ 'while(!myFile.eof())'が間違っているのですか?(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は、その第2引数として、を参照します。あなたのコードでは、あなたのベクトルは空です。したがってlines[i]i)は無効なメモリへの参照を返します。 getlineがそのメモリにアクセスしようとすると、プログラムがクラッシュします。

vectorの範囲外インデックスにアクセスしようとすると例外がスローされる場合は、lines[i]の代わりにlines.at(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); 
} 
関連する問題