读二进制文件C ++

时间:2011-03-09 16:40:39

标签: c++

我想请求帮助......我是从C ++开始的,我在学校完成了这项功课......我们必须编写应该阅读的函数bool UTF8toUTF16 (const char * src, const char * dst ); src 文件以UTF-8编码,并以UTF-16格式写入 dst 文件。我们也不能使用任何其他库而不是我的代码......

所以我要做的第一件事就是我创建了一个文件“xx.txt”,在经典的Windows记事本中我写了例如char'š'。然后我试着编写一个程序,以二进制模式逐字节(或逐字节)读取该文件的每个字符并打印它的值...但我的程序不能像那样...

< p> 所以我有这个文件'xx.txt',其中只有'š',它有UTF-8值'c5 a1',UTF-16值'0161'和Unicode值'161',我想它会打印出来的结果:i = 161(十六进制)或至少接近此结果的东西......

到目前为止,这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <iomanip>
#include <iostream>
#include <fstream>

using namespace std;

int main ( void ) {
    char name[] = "xx.txt";
    fstream F ( name, ios::in | ios::binary );
    unsigned int i;
    while( F.read ((char *) & i, 2))
    /* I dont know what size to write there - I would guess it s '2' - because I need 2     bytes for the char with hexUTF-16 code '0161', but 2 doesnt work*/
    cout << "i = " << hex << i << " (hex) ";
    cout << endl;
    F.close();
    system("PAUSE");
    return 0;}

提前致谢

NikolasJíša

3 个答案:

答案 0 :(得分:2)

在解析它之前,你不知道utf8中的字符有多大,你需要一次读一个“字符”,直到你有一个完整的utf8字符。

编辑 - 你没有说你输出的是什么 - 但我怀疑它是一个字节排序问题。
您可能更好地将输入(如果您知道它总是16位值)读入char数组,然后查看各个字节。

请参阅http://www.joelonsoftware.com/articles/Unicode.html

答案 1 :(得分:1)

如果您的输入是UTF-8,则需要一次读取一个字节,而不是两个(您希望i具有类型unsigned char) 。这为您提供了二进制数据流,您需要在UTF-8 Specification之后解码,这将生成unsigned int s(Unicode代码点)流,然后您需要重新编码根据{{​​3}}。

答案 2 :(得分:0)

这取决于。如果类的作用是包含这些对象(例如 一个容器类),然后它非常惯用,而且是正常的做法 的东西。然而,在大多数其他情况下,它被认为是优选的 使用getter和setter方法。不一定名为getXxx和 setXxx ---我见过的最常用的命名约定是使用m_attr 属性的名称,只需attr两个名称 吸气剂和二传手。 (操作员重载将在它们之间进行选择 根据论点的数量。)

- 詹姆斯坎泽