Byte读取文件字节,提供损坏的数据

时间:2013-05-10 16:08:57

标签: c++ binaryfiles readfile

所以我试图编写一个C ++程序,将整个文件读入内存(二进制)。 内存块显然是一个char数组。文件读取成功,但是当我遍历这些值时,其中一些不是字节,如4294967295。

我真的搜索并尝试了一切,但没有任何作用。 值得一提的是,我在阅读文件(文本)时没有这个问题。

这是代码:

char* XFile;
ifstream::pos_type Size;

bool LoadFile(string FileName)
{
    cout << "Opening File: " << FileName << endl;
    ifstream FS(FileName.c_str(),ios::in | ios::binary | ios::ate);

    if (!FS.is_open())
        return false;

    Size = FS.tellg();
    cout << "File Size: " << Size << " bytes" << endl;
    XFile = new char[Size];
    FS.seekg(0, ios::beg);
    FS.read(XFile,Size);

    for (int i = 0; i < 100; i++) // This loop is to test the read bytes (for example purposes)
        cout << static_cast<unsigned>(XFile[i]) << "\n";

    FS.close();

    return true;
}

2 个答案:

答案 0 :(得分:1)

组合:

 char* XFile;

 static_cast<unsigned>(XFile[i])

会导致XFile[i]首先转换为签名int,然后转换为unsigned。因此,如果文件中的值大于127,它将变为负整数值,然后显示为非常大的正值。您可以将char *更改为unsigned char *并解决问题,或者您可以将其分为两个阶段:

 static_cast<unsigned>(static_cast<unsigned char>(Xfile[i]))

请注意,这是“将数据转换为不同的表示形式”时,该值已损坏,实际从文件中读取的数据完全正常。

答案 1 :(得分:0)

默认char可以是已签名或未签名。在您的平台上,它显然已签名,static_cast<unsigned>将负数转换为大的正数。将unsigned char用于缓冲区而不是char