-1

所以我试图编写一个将整个文件读取到内存(二进制)的 C++ 程序。内存块显然是一个字符数组。文件读取成功,但是当我遍历这些值时,其中一些不是字节,例如 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;
}
4

2 回答 2

1

组合:

 char* XFile;

 static_cast<unsigned>(XFile[i])

将导致XFile[i]首先转换为带符号的int,然后转换为unsigned. 所以如果你文件中的值大于127,就会变成一个负整数值,然后显示为一个很大的正值。您可以更改char *tounsigned char *并解决问题,或者您可以分两个阶段进行转换:

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

请注意,这是“当将数据转换为不同的表示形式时”值被损坏的情况,您从文件中实际读取的数据非常好。

于 2013-05-10T16:17:56.893 回答
0

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

于 2013-05-10T16:18:08.080 回答