时间:2019-05-10 标签:c++freadjibberish

Posted

技术标签:

【中文标题】时间:2019-05-10 标签:c++freadjibberish【英文标题】:c++ fread jibberish 【发布时间】:2009-12-11 08:54:16 【问题描述】:

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

【问题讨论】:

请编辑以包含您在此处提出的实际问题:***.com/questions/1886743/… 一些注意事项: 1. 引用成员时无需使用this->。 2. 带有前导下划线“”的标识符名称是为编译器实现和语言保留的。如果需要,请尝试附加下划线,例如 'length'。 【参考方案1】:

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

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

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

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

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

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

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

【讨论】:

顺便说一句,我有宏,这就是 chr 因为 wchar_t,但正如上面所说,这是省略的。 原来文件是大端格式,但我很好奇,如果没有用户输入,如何确定文件格式? en.wikipedia.org/wiki/Byte_order_mark(我已经更新了完整的答案)。【参考方案2】:

fread 的签名是:

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

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

【讨论】:

【参考方案3】:

如果您使用 C++,为什么不使用std::fstream?

除此之外,您使用 unicode,请注意,c 和 c++ 是认真的lacking in their standard unicode support。 The answers here 可能会帮助您阅读这些 un​​icode 文件。

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

【讨论】:

这样更好吗?顺便说一句,也许您可​​以将您在此问题的副本中提出的实际问题添加到此问题中。 第一个链接很棒,因为它告诉我 wchar_t 的大小是在编译时确定的。我仍然没有看到告诉我使用不同的功能来阅读的意义......我确实有使用 fread 的特定原因,正如我之前所说的,它与我的问题无关。我并不是要忘恩负义,但我注意到这里的人们倾向于写很多与问题无关的垃圾,或者批评方法......当他们这样做时,他们会用不必要的垃圾填满帖子,愚弄人们认为问题已经解决,但实际上并没有。 当您处理时间敏感的材料时,这是一件非常令人沮丧的事情,而您的问题被忽略了。不过,我非常感谢有用的输入。 好吧,如果您现在需要一个答案,也许人们在闲暇时免费回答问题的网站不适合问它?关于我使用 std::fstream 的建议,可能有点冗长,但我的建议是真诚的。如果您打算使用 c++,请尝试使用 c++ 的优点。而且在转换的过程中,你可能会发现你的unicode问题也更容易在那里解决。 我并没有故意粗鲁,事实上我不认为我是。这个网站对我来说很棒,大多数时候当我提出问题时,只需几分钟就会有人回复,这只是在垃圾中除草很麻烦,而且你的权利也是如此,我应该期待它来自免费网站.非常感谢您花时间尝试帮助我解决问题。

以上是关于时间:2019-05-10 标签:c++freadjibberish的主要内容,如果未能解决你的问题,请参考以下文章

时间:2019-05-10 标签:c#socketconnectionwithmultithreadingtelnet

时间:2019-05-10 标签:c#paypalrestapitransactionsearch

时间:2019-05-10 标签:c#socketThread

时间:2019-05-10 标签:c++threadeddbclassmemorymixup

时间:2019-05-10 标签:c#applicationautostartwindows7

时间:2019-05-10 标签:c++freadjibberish