2013-05-10 417 views
-1

因此,我试图编写一个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

有一件事要提,我使用Ubuntu 13.04和g ++可能是重要的4.7 – 2013-05-10 16:11:35

+0

是什么'的sizeof(无符号)'我不认为你得到一个char那里。 – lcs 2013-05-10 16:14:00

回答

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])) 

需要注意的是这个的“数据转换成不同的表示时”的值被破坏的情况下, ,你的数据实际上是从文件中读取的,非常好。

0

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