Я написал код, который должен читать все новые строки в текстовом файле, но он застревает в одном из выполняемых циклов.
Код выглядит следующим образом:
#define MAX_MESSAGE_LENGTH 200;
fstream("some/random/file.txt", ios::in | ios::out);
streampos fileSizeReference = 0;
vector<string> messages;
vector<string> onDisplay;
char message[MAX_MESSAGE_LENGTH];
if((int)fileSizeReference == 0)
fileReader.seekg(0);
else
fileReader.seekg((int)fileSizeReference + 1);
cout << "Test" << endl;
// Add all new messages to the messages vector
do
{
fileReader.getline(message, MAX_MESSAGE_LENGTH);
string newMsg = message;
messages.push_back(newMsg.substr(0, MAX_MESSAGE_LENGTH));
}
while (!fileReader.eof());
//
cout << "Test" << endl;
fileReader.seekg(0, ios::beg);
// Set the newest messages in the onDisplay vector
for(int i = 0; i < amountOfMessages; i++)
{
onDisplay[i] = messages[messages.size() - (i + 1)];
}
//
cout << "Test" << endl;
// Display new messages
int current_Y = 0;
for(int i = 0; i < amountOfMessages; i++)
{
current_Y = renderText(messages[i], current_Y);
}
//
// set the new file size as the fileSizeReference
fileReader.seekg(0, ios::end);
fileSizeReference = fileReader.tellg();
Текстовый файл выглядит так:
Hello World!
Carpe Diem
Random Message
Каждый раз, когда я запускаю этот код, я не прохожу первый цикл do-while. Это первый запуск, поэтому fileSizeReference равен 0.
Переменная newMsg внутри цикла всегда является пустой строкой, как и массив сообщений.
Кто-нибудь из вас знает, почему мой код застревает? Заранее спасибо!
1 ответ
У вас две ошибки (как минимум).
do
{
fileReader.getline(message, MAX_MESSAGE_LENGTH);
string newMsg = message;
messages.push_back(newMsg.substr(0, MAX_MESSAGE_LENGTH));
}
while (!fileReader.eof());
Должно быть
while (fileReader.getline(message, MAX_MESSAGE_LENGTH))
{
string newMsg = message;
messages.push_back(newMsg.substr(0, MAX_MESSAGE_LENGTH));
}
Дополнительная информация Почему iostream :: eof внутри условия цикла (например, `while (! stream.eof ())`) считается неправильным?
Между прочим, эти две строки в цикле while также можно упростить, просто это будет отлично работать.
messages.push_back(message);
А во-вторых, после завершения чтения поток будет в состоянии ошибки, которую вам необходимо очистить, прежде чем вернуться к началу файла (закрытие и повторное открытие файла также будет работать).
while (fileReader.getline(message, MAX_MESSAGE_LENGTH))
{
string newMsg = message;
messages.push_back(newMsg.substr(0, MAX_MESSAGE_LENGTH));
}
fileReader.clear();
fileReader.seekg(0, ios::beg);
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.