fread后fwrite。这不一样

问题描述 投票:0回答:1

我读了一个文本文件,效果很好。

std::string str_buf = "";
FILE *file = fopen("/home/pi/log_2019-03-07.txt", "r");
if (file != NULL)
{
    while (true)
    {
        char buffer[MAX_BUFFER_SIZE] = { 0x00, };
        size_t rSize = fread(buffer, MAX_BUFFER_SIZE, sizeof(char), file);

        str_buf += buffer;

        if (rSize == 0)
            break;
    }

    printf("%s", str_buf.data());
    fclose(file);
}

然后我尝试将其写入相同的路径,另一个名称。这是代码:

FILE *writefile = fopen("/home/pi/WriteTest.txt", "wb");
if (writefile != NULL)
{
    int offset = 0;
    while (true)
    {
        size_t wSize = fwrite(&str_buf.data()[offset], sizeof(char), strlen(str_buf.data()) - 1, writefile);

        offset += (int)wSize;

        if (offset >= strlen(str_buf.data()))
            break;
    }
    fclose(writefile);
}

如果我尝试执行此代码,它可以工作。我打开WriteTest.txt,它有相同的字符串。它完全一样。 但我发现WriteTest.txt的音量几乎是两次读取文本。

为什么会这样?

c++
1个回答
1
投票
size_t wSize = fwrite(&str_buf.data()[offset], sizeof(char), strlen(str_buf.data()) - 1, writefile);

你开始在偏移&str_buf.data()[offset]写文本,但是你写了从位置0开始的字符串的长度。你写的offset字节太多了。你应该

size_t wSize = fwrite(&str_buf.data()[offset], sizeof(char), 
                      strlen(str_buf.data()) - offset, writefile);

此外,您不会写字符串长度而不是NULL终止符。因此,除非像在你的简单例子中那样,它在生命的终点,否则你无法弄清楚读取多少。

最后,使用str_buf.length()而不是strlen更好。它更快,适用于中间有NUL的字符串。

© www.soinside.com 2019 - 2024. All rights reserved.