簡體   English   中英

FILE結尾*指針不等於寫入數據的大小

[英]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+brb+打開二進制文件進行更新(讀寫)
w+bwb+截斷為零長度或創建二進制文件以進行更新
a+bab+追加; 打開或創建二進制文件以進行更新,在文件結尾處寫入

你可以看到他們區分wwb 我不相信一個實現需要處理兩個不同但它通常是安全使用二進制模式的二進制數據。

fwrite會返回什么? 通常,返回值應該是寫入的字節數。 此外,ftell()在fseek之前回答了什么?

它可能有助於了解什么操作系統,C編譯器版本和C庫。

filepointer是一個cookie。 它沒有任何價值。 您可以使用它的唯一方法是在文件中尋找相同的位置。 我甚至不確定ISO C是否保證ftell返回增加的值。 如果您不相信這一點,請查看不同的seek()模式。 它們的存在恰恰是因為位置不是簡單的字節偏移。

如果沒有刷新和可能的fsync,Windows實際上並不會將所有數據寫入文件。 也許這就是原因

暫無
暫無

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

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