0

ファイルからデータを読み取り、それをフォーマットして読み取り可能にする演習用のプログラムを作成しています。これまでのところ、ヘッダーをその下にあるデータから分離するコードが少しあります。ここにあります:

int main() {
    ifstream in("records.txt");
    ofstream out("formatted_records.txt");
    vector<string> temp;
    vector<string> headers;
    for (int i = 0; getline(in,temp[i]); ++i) {
        static int k = -1;
        if (str_isalpha(temp[i])) {
            headers[++k] = temp[i];
            temp.erase(temp.begin() + i);
        }
        else {
            temp[i] += "," + headers[k];
        }
    }
}

(str_isalpha()は、文字列内のすべての文字に適用される単なる関数ですisalpha()。) さて、このプログラムの for ループは実行されません。その理由がわかりません。誰か知っていますか?

編集:提案されたように、私はそれをに変更しました

string line;
for (int i = 0; getline(in,line); ++i) {
    temp.push_back(line);

forループを完全にスキップします。

4

2 に答える 2

5

vector<string> temp;空のベクトルを作成します。次に に読み込もうとするとtemp[0]、これは未定義の動作です。getlineの 2 番目の引数として別のstring変数を渡す必要があります。たとえばstring foo;、ループの前に、ループtemp.push_back(foo);本体の最初の命令として渡します。

于 2010-05-02T01:22:20.917 に答える
4

有効な文字列参照を読み取っていることを確認した後もループが実行されない場合は、読み取り元のストリームが有効であることを確認する必要があります。たとえば、ファイルが存在しない場合、またはファイルを読み取る権限がない場合、ストリームは無効になります。ストリームが有効でない場合、getline何も読み取れません。その戻り値は同じストリームであり、 に変換するboolと と評価されfalseます。続行する前に、ストリームのステータスを確認してください。

ifstream in("records.txt");
if (!in.is_open()) {
  std::cerr << "Uh-oh.\n";
  return EXIT_FAILURE;
}
于 2010-05-02T01:41:26.210 に答える