Файловые операции C ++ вызывают «сбой» во встроенном Linux - PullRequest
2 голосов
/ 24 марта 2011

Сейчас я работаю над проектом встраиваемой светодиодной измерительной системы. Он использует ARM и Linux, и имеет 64M памяти и 1G памяти. При измерении предполагается записывать данные в файл .csv. Я сделал это так:

  1. Создать / открыть файл до начала измерения
  2. В измерительном цикле, когда данные готовы, поместите их в файл и перейдите к следующему измерению
  3. Когда пользователь остановит измерение, файл будет закрыт

Но когда я добавляю эту функцию, программа продолжает работать несколько часов, после чего аппарат не реагирует ни на что (измерение остановлено, пользовательский интерфейс все еще отображается, но не реагирует на какие-либо действия и т. Д.). И CSV-файл составляет около 15 МБ. Хотя без этой функции машина может хорошо работать весь день. Я думал об этом, может быть, это потому, что память израсходована. С такой маленькой памятью возможно ли продолжать запись файла? Или я должен закрыть его каждый раз, когда я закончил писать данные? (В этом случае мне придется открывать / закрывать файл очень часто, это приведет к замедлению работы нашей системы, что не рад видеть) Извиняюсь за мой плохой английский, может быть, кто-то может понять это и помочь мне. Бог освещает твой путь, спасибо всем!

ps: я считаю, что сама файловая операция правильная.

код такой:

std::ofstream out_put;
out_put.open(filePath, std::ofstream::out | std::ofstream::trunc);

while(!userStoped()){

    doSomeMesuring();

    for(int itemIndex = 0; itemIndex < itemCount; ++itemIndex){
    out_put << ',' << itemName.toStdString() << ',' 
            << data->mdata.item[itemIndex].mvalue << ',' 
            << data->mdata.item[itemIndex].judge << std::endl;
    }
}

out_put.close();

1 Ответ

2 голосов
/ 24 марта 2011

Вы пишете в out_put, ofstream, но никогда не проверяете, является ли поток все еще действительным.Вы можете изменить его на

while (out_put.good() && (!userStoped())

Чтобы доказать себе, что именно запись в поток вызывает проблему, закомментируйте весь измерительный код, просто напишите много «x» (или вашВыбор символа!) в поток, чтобы увидеть, если у вас есть тот же результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...