C++ 文件操作在嵌入式 Linux 上导致 "crash"

标签 c++ memory file-io

我现在在一个嵌入式 LED 测量系统项目中。采用ARM & linux,64M内存,1G存储。测量时,应该将数据写入.csv 文件。我是这样做的:

  1. 在测量开始前创建/打开一个文件
  2. 在测量循环中,当数据准备好后,将其存入文件,然后进行下一次测量
  3. 当用户停止测量时,文件将被关闭

但是,当我添加此功能时,程序会持续运行几个小时,然后机器将无任何响应(测量停止、UI 仍显示但不响应任何操作等)。 csv 文件大约 15MB。 如果没有此功能,机器可以全天正常工作。 这个我想过,可能是内存用完了。这么小的内存,是不是可以一直写一个文件呢?还是每次写完数据就关闭? (那样的话,我就不得不非常频繁地打开/关闭文件,这会导致我们的系统变慢,有什么不高兴的) 为我糟糕的英语道歉,也许有人能理解并给我一些帮助。 上帝在照亮你的道路,谢谢大家!

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();

最佳答案

您写入“out_put”,ofstream,但从不检查流是否仍然有效。 你可以把它改成

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

为了向自己证明是写入流导致了问题,请注释掉所有测量代码,只需将大量“x”(或您选择的字符!)写入流以查看是否你有相同的结果。

关于C++ 文件操作在嵌入式 Linux 上导致 "crash",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5416934/

相关文章:

c++ - 自己线程中的 NSURLConnection 在没有自旋循环的情况下无法工作

c++ - 提升 asio 优先级队列,从处理程序添加异步操作

c++ - 如何创建安装程序文件

java - 负数会消耗更多内存吗?

sql-server - B+ 树索引究竟存储在哪里?

arrays - c 中的空数组大小

python - numpy.genfromtxt 没有解包

c++ - 在 C++ 中对字符串数组进行排序,无论是 'A' 还是 'a' 以及 å、ä ö?

c# - 在 ReadToEnd 之后关闭 StreamReader

wpf - Windows 文件名中不允许使用哪些字符以及如何限制它们在 C# 中键入