由于某种原因,我的缓冲区充满了乱语,我不知道为什么。我甚至用十六进制编辑器检查了我的文件,以验证我的字符是以2字节的unicode格式保存的。我不确定是什么问题。
fseek(_file_pointer, 0, SEEK_END);
this->_length = ftell(this->_file_pointer) / sizeof(chr);
//there is a reason for this, I just
//didn't include the code that tells why
typedef wchar_t chr;
chr *buffer = (chr*)malloc(f->_length*sizeof(chr));
if(buffer == NULL)return;
memset(buffer,0,f->_length*sizeof(chr));
f->Read_Whole_File(buffer);
f->Close();
free(buffer);
void Read_Whole_File(chr *buffer)
{
if(buffer == NULL)
{
this->_IsError = true;
return;
}
fseek(this->_file_pointer, 0, SEEK_SET);
int a = sizeof(buffer[0]);//for debugging purposes
fread(buffer, a, _length, this->_file_pointer);
}
答案 0 :(得分:1)
fread的签名是:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
其中size
是每个元素的大小,nmemb
是元素的数量。在您的情况下,size
为sizeof(chr)
,nmemb
是缓冲区的长度(字符。)
答案 1 :(得分:1)
假设你的错误处理(你说你在这里省略了)是合理的,我看到可能导致问题的两个原因:
首先,wchar_t
可能不一定是2个字节,其大小是实现定义的。例如,在Linux上,它最有可能是4个字节。
可能是文件是UTF-16BE(big-endian),并且您在little-endian平台上运行,因此缓冲区中的wchar_t
值的字节顺序是交换的。
或者,它们可能都是。请更新您的问题,其中包含有关您平台的一些详细信息以及样本文件中的几个字节(如果可能)。
在任何情况下,处理Unicode文件时都不应对标准C或C ++类型的大小做任何假设。
例如,如果要读取UTF16-BE,请使用C99 uint16_t
类型(或保证为16位的等效类型),并根据您的平台字节顺序交换输入的字节顺序 - ness和file endian-ness。如果文件中存在文件字节,则可以使用a byte order mark检测文件字符串。
或者,使用第三方Unicode库,如ICU。它负责所有特定于平台的细节,并且可以节省大量的时间在大型项目中进行调试。
答案 2 :(得分:0)
如果您使用的是C ++,为什么不使用std::fstream?
除此之外,你使用unicode,注意c和c ++是认真的lacking in their standard unicode support。 The answers here可能会帮助您阅读这些unicode文件。
但我必须再次强调,如果你使用的是c ++,请使用STL。另外,请检查此问题的优秀答案:std::wstring VS std::string。