c ++恐惧乱搞

时间:2009-12-11 08:54:17

标签: c++ c arrays memory-management file-io

由于某种原因,我的缓冲区充满了乱语,我不知道为什么。我甚至用十六进制编辑器检查了我的文件,以验证我的字符是以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);

[Read_Whole_File]

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); 
}

3 个答案:

答案 0 :(得分:1)

fread的签名是:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

其中size是每个元素的大小,nmemb是元素的数量。在您的情况下,sizesizeof(chr)nmemb是缓冲区的长度(字符。)

答案 1 :(得分:1)

假设你的错误处理(你说你在这里省略了)是合理的,我看到可能导致问题的两个原因:

  1. 首先,wchar_t可能不一定是2个字节,其大小是实现定义的。例如,在Linux上,它最有可能是4个字节。

  2. 可能是文件是UTF-16BE(big-endian),并且您在little-endian平台上运行,因此缓冲区中的wchar_t值的字节顺序是交换的。

  3. 或者,它们可能都是。请更新您的问题,其中包含有关您平台的一些详细信息以及样本文件中的几个字节(如果可能)。

    在任何情况下,处理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 supportThe answers here可能会帮助您阅读这些unicode文件。

但我必须再次强调,如果你使用的是c ++,请使用STL。另外,请检查此问题的优秀答案:std::wstring VS std::string