Почему этот цикл for не выполняется? - PullRequest
0 голосов
/ 02 мая 2010

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

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.

Ответы [ 2 ]

5 голосов
/ 02 мая 2010

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

4 голосов
/ 02 мая 2010

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

ifstream in("records.txt");
if (!in.is_open()) {
  std::cerr << "Uh-oh.\n";
  return EXIT_FAILURE;
}
...