c++ - fwrite 失败(返回 0,perror 给出 "Bad address")

标签 c++ fwrite

出现这种错误的可能原因是什么。正在写入的文件创建没有问题,但 fwrite 每次都失败。

我正在从 32 位小端移植到 64 位大端。

我写的结构是

struct Node 
{
uint8_t *a;
uint32_t *b;
uint32_t c;
uint32_t d;
uint32_t e;
uint32_t f;     
uint32_t g; 
uint16_t h; 
uint8_t i;  
uint8_t j;  
uint8_t k[MAX];
uint32_t (*l)[2];
uint32_t m; 
uint32_t n;

Node() {
    memset(this, 0, sizeof(*this));
    l = NULL;
    a = (uint8_t*)calloc(N,1);
}
~Node() {
    free(a);
    free(b);
}
};

写节点的代码是

void push(void *ptr)
{
Node *node = (Node *) ptr;
assert(fwrite(node, sizeof(Node), 1, fpw) == 1);
    free(node);
}

fpw 具有全局作用域。

当我尝试调试时,我发现 fwrite 返回 0 并且 perror 给出“Bad address”作为错误。

如有任何建议,我们将不胜感激。

最佳答案

我不确定我在这里能为您提供答案,但我认为值得指出我在您的代码中看到的一些内容。我希望解决这些问题会帮助您克服问题。

  1. 当您有一个要转储到文件中的类时 - 让该类为您完成工作。这意味着,您的 Node类将有一个 write/read设置,或 operator<</operator>>或您将调用的任何其他常规例程集,并将其自身序列化为文件,然后在读取时从文件中反序列化自身。 Boost为您提供tools也可以为此提供帮助。

  2. 转储类指针的内容是一件危险的事情,尤其是如果您在一个架构上转储并在另一个架构上读取(在您的情况下是 32LE 与 64BE)。它肯定会以各种不可预测的方式失败。

  3. 您在未验证其有效性的情况下访问从某处获得的指针。我不知道你有没有测试你的ptr在你打电话之前 push , 但我相信检查 push 中的指针会有帮助本身,特别是如果错误表明它可能不好。

  4. 您正在编写 C++ 代码。你正在毁掉一个类(class)。 <强> free 不应该在你的代码中的任何地方!您正在创建 Node* nodemalloc ?我希望不会!如果您使用 new必须使用delete .

  5. 您正在释放 ab在你的~Node ,但您不会将它们分配到任何地方。如果你没有在构造函数中分配它——当你在析构函数中删除它时——验证你分配了它们,否则你也会在这里得到一堆未定义的行为。

    <

只是一些忍不住注意到的东西,希望对你有帮助。

关于c++ - fwrite 失败(返回 0,perror 给出 "Bad address"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7976168/

相关文章:

php - 使用PHP fwrite写入php文件

php - 使用 jQuery AJAX 和 PHP 将 div 的内容保存到新文件

c - 为什么会出现段错误(核心转储)?

c++ - 使用 SDL 的智能指针

c++ - 物体轮廓上的opencv角点检测

c++ - 如何使用opencv C++将3D矩阵分成一堆2D矩阵

c++ - 为什么我在使用 fwrite() 和 fread() 时遇到问题?

PHP 循环写入文本文件

c++ - 如果 std::vector 作为 T::Zero 存在,如何生成代码以使用自定义零值初始化 std::vector?

c++ - DebugView 打印列显示 "????"