簡體   English   中英

fread后恐懼。 這不一樣

[英]fwrite after fread. It's different

我讀了一個文本文件,效果很好。

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的容量幾乎是讀取文本的兩倍。

為什么會發生?

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

您開始在offset &str_buf.data()[offset]處寫入文本,但是從位置0開始寫入字符串的長度。您寫入的offset字節太多了。 你應該

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

另外,您不寫字符串長度也不寫NUL終止符。 因此,您將很難弄清楚要讀多少,除非像您的簡單示例中那樣,它在文件的末尾。

最后,最好使用str_buf.length()而不是strlen。 它更快,並且可以與中間帶有NUL的字符串一起使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM