Вопрос

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

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

РЕДАКТИРОВАТЬ: Как предполагалось, я изменил это на

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

Все еще пропускает для петли вообще.

Это было полезно?

Решение

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top