由 C++ 编写

标签 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);

[读取整个文件]

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

最佳答案

假设您的错误处理(您说您在此处省略)是正确的,我认为有两个原因可能是问题的原因:

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

  2. 可能文件是 UTF-16BE(大端),而你运行在小端平台上,所以缓冲区中的 wchar_t 值有它们的字节调换顺序。

或者,两者都可以。请使用有关您的平台的一些详细信息和十六进制示例文件中的几个字节(如果可能)更新您的问题。

无论如何,在处理 Unicode 文件时,您不应该对标准 C 或 C++ 类型的大小做出任何假设。

例如,如果您想读取 UTF16-BE,请使用 C99 uint16_t 类型(或保证为 16 位的等效类型),并根据您的输入交换字节顺序平台字节序和文件字节序。您可以使用 a byte order mark 检测文件字节序如果它存在于文件中。

或者,使用第三方 Unicode 库,例如 ICU .它会处理所有特定于平台的细节,并会为您节省大量在大型项目中进行调试的时间。

关于由 C++ 编写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1886708/

相关文章:

php - 更新函数内的全局数组

arrays - 你如何在matlab中使数组中的每个其他整数等于0?

c++ - 将 gprof 与 LULESH 基准结合使用

c++ - 如何阅读和理解 C & C++ 标准以及其中使用的语言语法?

c - snmpwalk 无法遍历带有 "accessible-for-notify"项的表

java - 将文本文件的 X 和 Y 坐标读取到数组列表中

c++ - gcc c++ 命令行错误消息解析器

c++ - C++中内置类型的自定义构造函数

c - fgetc 省略字符然后分配整数

c - C 中的线程问题