问题描述
我正在构建一个需要在英文文件中间添加阿拉伯字符的应用程序,我构建的函数如下:
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);
等