尝试使用带有模式" a +"的fwrite()将新文本附加到现有文件但得到奇怪的字符串写

时间:2016-04-28 23:44:39

标签: c++ fwrite

我正在编写一个程序,每次调用时都会将文本插入到文件中。我不想重写整个文件,我希望新文本可以插入到新行中。这是我的测试代码:

pg

第一次打电话时,一切正常。创建了一个新文件,并成功写入了数据。但是当我再次调用它并期望插入一个新数据时,我在文件中得到了奇怪的字符串,例如:慨慨慨桡桡桡a。

我对C ++ I / O功能并不熟悉。谁能告诉我我做错了什么?另外,是否有任何建议将文字附加到下一行?

2 个答案:

答案 0 :(得分:1)

我认为您遇到了代码集问题,而您用来查看您编写的文件的程序希望在文件中找到UTF-16数据。

我的基础是对你引用的字符串的分析:

慨慨慨栀桡桡a

当该(UTF-8)数据转换为Unicode值时,我得到:

0xE6 0x85 0xA8 = U+6168
0xE6 0x85 0xA8 = U+6168
0xE6 0x85 0xA8 = U+6168
0xE6 0xA0 0x80 = U+6800
0xE6 0xA1 0xA1 = U+6861
0xE6 0xA1 0xA1 = U+6861
0x61 = U+0061
0x0A = U+000A

Unicode值U + 6168以小端表示为字节0x68 0x61,h的ASCII码为104(0x68),a的ASCII码为97(0x61)。因此,数据可能写得正确,但对所写数据的解释是不正确的。

正如我在comment中所说:

  

如果你想要文件中的行,你需要把它们放在那里(通过在写入的数据上添加换行符),因为fwrite()不会输出任何换行符,除非它们是在数据中给它写。您已经为文件写了一个空字节(因为您使用了data_size = 7),这意味着该文件实际上不是文本文件(文本文件不包含空字节)。接下来会发生什么取决于您使用的代码集。

输出中的尾随单字节代码出现是因为第二个空字节在此页面上粘贴的内容中不可见,并且echo添加了尾随的U + 000A在我用于分析的命令行中(其中utf8-unicode是我写的程序):

 echo "慨慨慨栀桡桡a" | utf8-unicode

答案 1 :(得分:0)

将您的代码更改为:

char* data = "hahaha\0";
pFile = fopen("textfile.bin","a+");
if (pFile!=NULL)
{
    fwrite (data, sizeof(char), strlen(data), pFile);
    fclose (pFile);
}