Я написал код, который должен читать все новые строки в текстовом файле, но он застревает в одном из выполняемых циклов.

Код выглядит следующим образом:

#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 внутри цикла всегда является пустой строкой, как и массив сообщений.

Кто-нибудь из вас знает, почему мой код застревает? Заранее спасибо!

c++
0
V.Molotov 26 Июн 2020 в 15:41

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);
2
john 26 Июн 2020 в 12:51