2016-09-21 165 views
3

例如,當使用fscanf()讀取一個文件時,它似乎記住了它最後一次終止的位置,而不是從文件開頭再次開始。有人可以詳細說明這是如何工作的?我發現很難使用這些函數,因爲我不瞭解這個組件。fscanf()和fgets()等函數如何記住文件開始讀取的位置?

+0

這就是'FILE *'參數的用途。 – kaylum

+0

@kaylum請你詳細說明一下嗎?我想對此有一個很好的概念性理解。我應該提及我非常瞭解使用FILE *,但我並不知道它承擔了此功能。請詳細說明。 –

+0

他們存儲上次閱讀的位置。這與你用'fseek'調整的是一樣的。 –

回答

6

FILE *參數指向一個緩衝區和一個文件句柄(請參閱fileno()函數)。

實際在文件結構中的內核中記住的位置。

有一個傳說,FILE *指針指向該文件。這不是字面上的真實,但對於開始的程序員的解釋可能也是如此。

實際上發生的情況如下:每個進程都有一個類型爲struct file(該類型未在用戶空間中定義,因此不去查找它)的內核中的數組,該數組包含其所有打開的文件。 open()系統調用返回句柄,該句柄僅僅是數組中的一個索引。函數fileno()fopen()返回的FILE *指針中檢索句柄,並且可以直接操作。除了訪問ioctl()fctl()之外,這通常是一個糟糕的主意,因爲您最終會與FILE對象中的內部緩衝區發生衝突。

struct file的成員之一是loff_t f_pos,它是以字節爲單位的內核read()write()停止的確切位置。這被緩存在FILE中,它知道它提前讀取了多少字節或者稍後寫給你。

+0

謝謝,約書亞。你能詳細說明究竟發生了什麼嗎?我想要一個關於這裏發生的事情的好概念。 –