尝试读取二进制文件C ++时出现问题

时间:2013-03-20 11:49:31

标签: c++ file binary ifstream cer

我正在用Visual Studio C ++编写一个简单的控制台应用程序。我想读取一个字节数组扩展名为.cer的二进制文件。

ifstream inFile;
size_t size = 0; 
char* oData = 0;
inFile.open(path, ios::in|ios::binary);

if (inFile.is_open())
{
    size = inFile.tellg();     // get the length of the file
    oData = new char[size+1];  //  for the '\0'
    inFile.read( oData, size );
    oData[size] = '\0' ;       // set '\0'

    inFile.close();
    buff.CryptoContext = (byte*)oData;
    delete[] oData;
}

但是当我启动它时,我会在所有oData个字符中收到相同的字符,每次都是另一个字符,例如:

oData = "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...".

然后我尝试了另一种方式:

std::ifstream in(path, std::ios::in | std::ios::binary);

if (in)
{
    std::string contents;

    in.seekg(0, std::ios::end);
    contents.resize(in.tellg());

    in.seekg(0, std::ios::beg);
    in.read(&contents[0], contents.size());

    in.close();
}

现在内容有非常奇怪的值:部分值是正确的,部分是负数和奇怪值(可能与signed charunsigned char有关。)。

有没有人有任何想法?

提前致谢!

2 个答案:

答案 0 :(得分:1)

您正在设置CryptoContext以通过byte指针指向您的数据,然后删除该数据!

buff.CryptoContext = (byte*)oData;
delete[] oData;

此行之后,CryptoContext指向已释放和无效的数据。只需将oData数组保留在内存中,并在完成解码或其他任何操作后将其删除。

答案 1 :(得分:1)

查看第一个版本:

是什么让你认为tellg获得了流的大小?它没有,returns the current read position。然后,您继续将指向数据的指针发送到buff.CryptoContents并立即删除指向的数据!这是非常危险的做法;您需要复制数据,使用智能指针或以其他方式确保数据具有正确的生命周期。如果您正在调试模式下运行,那么删除可能会使用标记来标记数据以显示它已被删除,这就是您获取相同字符流的原因。

我怀疑你对签名和未签名的建议可能是正确的,但我不能说没有看到你的文件和数据。