Почему это не выполнять?
Вопрос
Я пишу программу для упражнения, которое будет читать данные из файла и форматировать его для чтения. До сих пор у меня есть немного кода, который отделяет заголовок от данных, которые поступают под ним. Вот:
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);
как первая инструкция в теле петли.