Почему этот цикл for не выполняется?

Я пишу программу для упражнения, которое будет считывать данные из файла и форматировать их для чтения. Пока что у меня есть немного кода, который будет отделять заголовок от данных, которые идут под ним. Вот:

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 в этой программе не выполняется, и я не могу понять, почему. Кто-нибудь знает?

EDIT: как было предложено, я изменил его на

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

По-прежнему пропускает цикл for.


person Maulrus    schedule 02.05.2010    source источник
comment
это запятая в параметре getline?   -  person Holograham    schedule 02.05.2010
comment
Да, именно так аргументы разделяются в функции, не так ли?   -  person Maulrus    schedule 02.05.2010


Ответы (2)


Если цикл по-прежнему не запускается после проверки того, что вы читаете действительную ссылку на строку, вам следует проверить, что поток, из которого вы читаете, действителен. Поток будет недействительным, если файл не существует или, например, у вас нет прав на его чтение. Когда поток недействителен, getline ничего не читает. Его возвращаемое значение — тот же поток, и при преобразовании в bool оно оценивается как false. Прежде чем продолжить, проверьте статус потока.

ifstream in("records.txt");
if (!in.is_open()) {
  std::cerr << "Uh-oh.\n";
  return EXIT_FAILURE;
}
person Rob Kennedy    schedule 02.05.2010
comment
Спасибо, проблема оказалась в этом. - person Maulrus; 02.05.2010

vector<string> temp; создает пустой вектор. Когда вы затем пытаетесь прочитать в temp[0], это поведение undefined. Вы должны передать в качестве второго аргумента getline отдельную переменную string, скажем, string foo; перед циклом, затем temp.push_back(foo); в качестве первой инструкции в теле цикла.

person Alex Martelli    schedule 02.05.2010