【问题标题】:C++ file operations cause "crash" on embedded LinuxC++ 文件操作导致嵌入式 Linux 上的“崩溃”
【发布时间】:2013-09-13 00:44:08
【问题描述】:

我现在从事嵌入式 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();

【问题讨论】:

  • 能否提供相关代码或重现错误的最小示例?
  • 你能粘贴你的代码吗?或者也许尝试找到一个可以在此处粘贴的小型可重现测试用例?
  • 我建议您在嵌入式系统上使用 C。你的结果会好得多。这里有很多很好的理由:stackoverflow.com/questions/4352425/…。最重要的是,只需在 C++ 所需的额外工具中进行映射,内存使用量就会显着增加。
  • @Matt Joiner:再读一遍。它是 64 MB,而不是 KB。
  • itemIndex 初始化/增量在哪里?

标签: c++ memory file-io


【解决方案1】:

您写入“out_put”,即 ofstream,但从不检查流是否仍然有效。 您可以将其更改为

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多