所以我试图编写一个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;
}
答案 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
。