FileStore::OpenErr 在内存位置 0x012FED64

Posted

技术标签:

【中文标题】FileStore::OpenErr 在内存位置 0x012FED64【英文标题】:FileStore::OpenErr at memory location 0x012FED64 【发布时间】:2018-01-24 10:55:59 【问题描述】:

我正在使用 Crypto++ 库来散列文件。我在该行收到错误 FileStore::OpenErr at memory location 0x012FED64

FileSource file(filename.c_str(), false, new HexEncoder(new StringSink(result)));

代码是:

#include <iostream>
#include "..\cryptopp\sha.h"
#include "..\cryptopp\hex.h"
#include "..\cryptopp\files.h"
using namespace std;

string hashFile(string filename);

int main() 
    string shahash("");
    string fileName = "D:\test.txt";
    shahash = hashFile(fileName);
    cout << shahash << endl;
    return 0;


string hashFile(string filename)

    string result;
    SHA256 hash;
    FileSource file(filename.c_str(), false, new HexEncoder(new StringSink(result)));

    file.PumpAll();
    return result;

详细错误如下:

Exception thrown at 0x764B08B2 in myproject.exe: Microsoft C++ exception: CryptoPP::FileStore::OpenErr at memory location 0x012FED64.
Unhandled exception at 0x764B08B2 in myproject.exe: Microsoft C++ exception: CryptoPP::FileStore::OpenErr at memory location 0x012FED64.

The program '[13128] myproject.exe' has exited with code 0 (0x0).

描述错误的截图是:

出现这种错误的可能原因是什么?

谢谢。

【问题讨论】:

【参考方案1】:
string fileName = "D:\test.txt";

应该是

string fileName = "D:\\test.txt";

\t 是制表符。我很确定你不希望在你的文件名中使用它。

【讨论】:

【参考方案2】:

可以使用 errno 以编程方式检查它吗?添加到文件的开头:

#include <cerrno> // for errno
#include <cstring> // for strerror

然后将你抛出的 hashfile 调用包装到 try 中:

try

    shahash = hashFile(fileName);
 
catch(CryptoPP::FileStore::OpenErr const&)

    cout << "Error: " << strerror(errno) << '\n';
    return 42;    

如果在堆栈展开期间没有在析构函数中进一步调用失败,则 errno 会告诉 cout 那个文件出了什么问题。此外,您还摆脱了未处理的异常崩溃。

我的猜测是 "D:\test.txt" 是错误的文件名,而您想要 "D:\\test.txt"

【讨论】:

OP 应该能够检查FileStore::OpenErr 提供的消息。它会告诉他无法打开的文件名。 errno 可能不会返回更多信息,因为 OP 已经知道存在打开错误。 @jww OpenErr 告诉文件存在 IO_ERROR,文件名是他已经知道的奇怪文件名。 Errno 告诉它出了什么问题。

以上是关于FileStore::OpenErr 在内存位置 0x012FED64的主要内容,如果未能解决你的问题,请参考以下文章

方法存储在内存中的啥位置?

参数变量存储在内存中的啥位置?

数组存储在内存中的啥位置?

为啥在内存位置写入访问冲突[重复]

如何在Elixir中获取变量的内存位置?

C++ 指针和数据位置:数据总是被放置在相同的内存位置