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

trying to append new text to an existing file using fwrite() with mode "a+" but get weird string written

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

void writeFile()
{
    FILE *pFile;
    char* data = "hahaha";
    int data_size = 7;
    int count = 1;
    pFile = fopen("textfile.bin","a+");
    if (pFile!=NULL)
    {
        fwrite (data, data_size, count, pFile);
        fclose (pFile);
    }
}

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

我不太熟悉 C++ I/O 函数。有人可以告诉我我做错了什么吗?另外,对于将文本附加到下一行有什么建议吗?

我认为您 运行 遇到了代码集问题,您用来查看您编写的文件的程序希望在文件中找到 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 为 97 (0x61)。因此,数据可能写入正确,但写入数据的解释不正确。

正如我在 中指出的那样:

If you want lines in the file, you'll need to put them there (by adding newlines to the data that is written), because fwrite() won't output any newlines unless they are in the data it is given to write. You have written a null byte to the file (because you used data_size = 7), which means the file is not really a text file (text files don't contain null bytes). What happens next depends on the code set you're using.

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

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

将您的代码更改为:

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