在抛出 'std::runtime_error' what() 的实例后调用终止:filebuf 和 ostream 的 I/O 错误

新手上路,请多包涵

我正在尝试序列化几个文本文件,并且我有这样的功能:

 void to_file_px(Ciphertext* encryptedPx, int index) {
    // Serialize Pixel i

    //red
    filebuf* fbCipherR; // EDIT: THIS LINE IS PROBLEMATIC
    string* filenameR = new string("../serialization/pixels/px" + to_string(index) + "R.txt");
    fbCipherR -> open((*filenameR).c_str(), std::ios::out|std::ios::binary);
    ostream* osCipherR = new ostream(fbCipherR);
    encryptedPx[0].Ciphertext::save((*osCipherR));
    fbCipherR -> close();
    delete filenameR;
    delete fbCipherR;
    delete osCipherR;

    //green

    //blue

    delete[] encryptedPx;
}

但是,此函数会导致错误为 Segmentation fault (core dumped)

我可以知道究竟是什么导致了错误吗?

注: Ciphertext::save 来自微软SEAL


好吧,我犯了一个错误。我没有初始化 filebuf*

所以我改变了 filebuf* fbCipherR = new filebuf(); 我得到了一个新的错误信息:

 terminate called after throwing an instance of 'std::runtime_error'
  what():  I/O error
Aborted (core dumped)

原文由 Taihouuuuuuuuuuu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 826
2 个回答

您的异常可能是由于打开文件失败,您应该在使用之前检查缓冲区/流的状态。

您可以通过使用 ofstream 而不是 filebuf 并将所有内容放在堆栈上而不是堆分配来简化您的代码:

 void to_file_px(Ciphertext* encryptedPx, int index) {
    // Serialize Pixel i

    //red
    string filenameR = "../serialization/pixels/px" + to_string(index) + "R.txt";
    ofstream osCipherR(filenameR.c_str(), std::ios::out|std::ios::binary);
    if (!osCipherR)
    {
       std::cout << "error opening output file\n";
    }
    else
    {
        encryptedPx[0].Ciphertext::save(osCipherR);
    }

    //green

    //blue

    delete[] encryptedPx;
}

原文由 Alan Birtles 发布,翻译遵循 CC BY-SA 4.0 许可协议

您应该 在 stack 而不是 heap 中 分配变量,因为它们是默认构造并自动销毁的。

 filebuf fbCipherR;
string filenameR = "../serialization/pixels/px" + to_string(index) + "R.txt";
fbCipherR.open(filenameR.c_str(), std::ios::out|std::ios::binary);
ostream osCipherR(fbCipherR);
encryptedPx[0].Ciphertext::save(osCipherR);
fbCipherR.close();

您的程序被终止,因为有一个未捕获的异常。您应该在每个线程中处理异常。 如何捕捉异常

原文由 VLL 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题