Я пытаюсь сделать мою программу прочитанной в данных из файла данных (.dat) (который на самом деле является только текстовым файлом). Поэтому, конечно, я использую условие цикла while(!file.eof())
, но это никогда не возвращается. Вот моя функция:Почему eof() никогда не возвращается?
void Table::readIn(const char finput[]){
std::ifstream file;
file.open(finput);
if (!file.is_open())
{
std::cout << "Cannot open " << finput << std::endl;
return;
}
char key[100];
file.get(key, 99, '\n');
while (!file.eof())
{
stock * item = new stock;
item->setTick(key);
file.get(key, 99, '\n');
item->setName(key);
file.get(key, 99, '\n');
item->setValue(atof(key));
file.get(key, 99, '\n');
item->setDate(key);
file.get(key, 99, '\n');
item->setYearReturn(atof(key));
file.get(key, 99, '\n');
addStock(item);
}
}
и вот что в моем файле данных:
TSLA
Tesla Motors, Inc.
30160000000
November 6, 2015
13.1
Я хотел бы дать вам, ребята, больше информации, но тот факт, что программа зацикливается через петлю while (!file.eof())
в течение неопределенного времени все, что я знаю об этой проблеме.
Редактировать: Я провел это через отладчик с точкой разрыва в каждой строке цикла while
. Я обнаружил, что первый вызов get()
(до цикла while
) устанавливает key
в правильное значение, но каждый вызов get()
после этого устанавливает key
в ""
. Я предполагаю, что это потому, что программа никогда не читает первый символ '\n'
в файле. Вы, ребята, знаете, как это исправить?
Редактировать 2: Этот вопрос отличается от: Why is iostream::eof inside a loop condition considered wrong?, потому что я должен читать более чем в одной строке каждый раз, когда пробегу через цикл while
.
Для начала флаги 'eofbit' не установлены до тех пор, пока вы не попытаетесь прочитать из-за конца файла, что означает, что ваш цикл не будет работать так, как вы ожидаете. Чтобы продолжить, попробуйте выполнить код по строкам в отладчике, ваше чтение не будет работать так, как вы ожидаете. –
@JoachimPileborg Итак, первый вызов 'get()' (до цикла while) устанавливает 'ключ' в правильное значение, но каждый вызов' get() 'после этого устанавливает' key' в "". Я предполагаю, что это потому, что программа никогда не читает первый символ «\ n» в файле. Вы знаете, как я это исправим? – LarryK
Простейшее решение? Используйте строки 'std :: string' и' std :: getline' для чтения строк. –