如何使用 C++ 在文件中间添加阿拉伯字符?

问题描述

我正在构建一个需要在英文文件中间添加阿拉伯字符的应用程序,我构建的函数如下:

int main(void) {

    std::ifstream mySource("Test2.txt",std::ios::out);
    std::filebuf* pbuf = mySource.rdbuf();
    std::size_t size = pbuf->pubseekoff(0,mySource.end,mySource.in);
    pbuf->pubseekpos(0,mySource.in);
    char* buffer = new  char[size];
    pbuf->sgetn(buffer,size);
    mySource.close();

    wchar_t* wbuffer = new wchar_t[size];
    wbuffer = GetWC(buffer);

    setlocale(LC_ALL,"en_GB.utf8");
    wbuffer[79] = {0x0041};
   
    std::wofstream outdata2;
    outdata2.open("Test6.xml"); // opens the file
    outdata2 << wbuffer;
    outdata2.close();
  
    return 0;
}

对于文本文件如下:

$ cat dat/rbgtst.txt
400,280: (234,163,097) #EAA361
400,300: (000,000,000) #000000
400,320: (064,101,160) #4065A0
400,340: (220,194,110) #DCC26E

并期待收到

$ cat dat/rbgtst.txt
400,000) #A00000
400,110) #DCC26E

虽然当我把阿拉伯字母 ASCII 像:

...
wbuffer[79] = {0x0628};
...

我收到以下信息:

$ cat dat/rbgtst.txt
400,000) #

不知道为什么?!

解决方法

您用于输出的函数将以空字符终止。相反,您应该使用 ostream::write 作为输出

outdata2.write(wbuffer,size);

此外,由于您正在执行二进制 I/O,因此您的所有文件都应使用 std::ios::binary 位设置打开。

std::ifstream mySource("Test2.txt",std::ios::out|std::ios::binary);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...