![](/img/trans.png)
[英]Why is data written to a file opened with O_APPEND flag, always written at the end, even with `lseek`?
[英]End of FILE* pointer is not equal to size of written data
非常簡單地說,我有以下代碼片段:
FILE* test = fopen("C:\\core.u", "w");
printf("Filepointer at: %d\n", ftell(test));
fwrite(data, size, 1, test);
printf("Written: %d bytes.\n", size);
fseek(test, 0, SEEK_END);
printf("Filepointer is now at %d.\n", ftell(test));
fclose(test);
它輸出:
Filepointer at: 0
Written: 73105 bytes.
Filepointer is now at 74160.
這是為什么? 為什么寫入的字節數與文件指針不匹配?
由於您在文本模式下打開文件,它會將行尾標記(如LF)轉換為CR / LF。
如果您在Windows上運行,可能就是這種情況(考慮到您的文件名以"c:\\"
開頭,您可能就是這樣)。
如果你以"wb"
模式打開文件,我懷疑你會發現這些數字是相同的:
FILE* test = fopen("C:\\core.u", "wb");
C99標准在7.19.5.3 The fopen function
有這個說法7.19.5.3 The fopen function
:
參數模式指向一個字符串。 如果字符串是以下之一,則文件以指示的模式打開。 否則,行為未定義。
r
打開文本文件進行閱讀
w
截斷為零長度或創建用於寫入的文本文件
a
追加; 打開或創建文本文件以便在文件結尾處寫入
rb
打開二進制文件進行讀取
wb
截斷為零長度或創建二進制文件進行寫入
ab
追加; 打開或創建二進制文件,以便在文件結尾處寫入
r+
打開文本文件進行更新(讀寫)
w+
截斷為零長度或創建文本文件以進行更新
a+
追加; 打開或創建文本文件以進行更新,在文件結尾處寫入
r+b
或rb+
打開二進制文件進行更新(讀寫)
w+b
或wb+
截斷為零長度或創建二進制文件以進行更新
a+b
或ab+
追加; 打開或創建二進制文件以進行更新,在文件結尾處寫入
你可以看到他們區分w
和wb
。 我不相信一個實現需要處理兩個不同但它通常是安全使用二進制模式的二進制數據。
fwrite會返回什么? 通常,返回值應該是寫入的字節數。 此外,ftell()在fseek之前回答了什么?
它可能有助於了解什么操作系統,C編譯器版本和C庫。
filepointer是一個cookie。 它沒有任何價值。 您可以使用它的唯一方法是在文件中尋找相同的位置。 我甚至不確定ISO C是否保證ftell返回增加的值。 如果您不相信這一點,請查看不同的seek()模式。 它們的存在恰恰是因為位置不是簡單的字節偏移。
如果沒有刷新和可能的fsync,Windows實際上並不會將所有數據寫入文件。 也許這就是原因
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.