例如,當使用fscanf()
讀取一個文件時,它似乎記住了它最後一次終止的位置,而不是從文件開頭再次開始。有人可以詳細說明這是如何工作的?我發現很難使用這些函數,因爲我不瞭解這個組件。fscanf()和fgets()等函數如何記住文件開始讀取的位置?
3
A
回答
6
FILE *
參數指向一個緩衝區和一個文件句柄(請參閱fileno()
函數)。
實際在文件結構中的內核中記住的位置。
有一個傳說,FILE *
指針指向該文件。這不是字面上的真實,但對於開始的程序員的解釋可能也是如此。
實際上發生的情況如下:每個進程都有一個類型爲struct file
(該類型未在用戶空間中定義,因此不去查找它)的內核中的數組,該數組包含其所有打開的文件。 open()
系統調用返回句柄,該句柄僅僅是數組中的一個索引。函數fileno()
從fopen()
返回的FILE *指針中檢索句柄,並且可以直接操作。除了訪問ioctl()
或fctl()
之外,這通常是一個糟糕的主意,因爲您最終會與FILE
對象中的內部緩衝區發生衝突。
struct file
的成員之一是loff_t f_pos
,它是以字節爲單位的內核read()
或write()
停止的確切位置。這被緩存在FILE
中,它知道它提前讀取了多少字節或者稍後寫給你。
+0
謝謝,約書亞。你能詳細說明究竟發生了什麼嗎?我想要一個關於這裏發生的事情的好概念。 –
相關問題
- 1. 如何正確使用fscanf和fgets從文件中讀取
- 2. fgets打開的等效函數
- 3. 如何使用fgets從文件讀取?
- 4. PHP fscanf vs fgets
- 5. 使用fscanf讀取文件()
- 6. 如何使用這兩種scanf函數和與fgets讀取文件
- 7. 選取框標記開始位置
- 8. 用fscanf讀取文件的下一行()
- 9. 的fscanf讀取不以文件
- 10. fscanf讀取空文件時崩潰
- 11. 讀取文件的文件位置
- 12. 從位置讀取文件
- 13. 從數組中的任意位置開始讀取
- 14. 記住RadioButton的位置
- 15. C - 從函數中讀取stdin與fgets()中的函數
- 16. 使用fgets讀取一個.CSV文件
- 17. 如何使用fscanf讀取c中的文件(分段錯誤)?
- 18. 開始讀取和Python的
- 19. 在matlab中讀取的混合數字和非數字數據的fscanf文件
- 20. 使用fgets和strtok從文件中讀取和解析行
- 21. 記住用戶位置mvc
- 22. Javascript菜單記住位置
- 23. 記住SlickGrid滾動位置
- 24. 記住滾動位置
- 25. 打開文件和讀取數據
- 26. 在Java Web中讀取文件開始
- 27. 從頭開始讀取文件
- 28. 如何從Julia開始讀取一個x字節的文件?
- 29. 從C(scanf,fseek,fgets)中的文件讀取特定行數
- 30. 無法使用fopen和fread函數打開並讀取文件
這就是'FILE *'參數的用途。 – kaylum
@kaylum請你詳細說明一下嗎?我想對此有一個很好的概念性理解。我應該提及我非常瞭解使用FILE *,但我並不知道它承擔了此功能。請詳細說明。 –
他們存儲上次閱讀的位置。這與你用'fseek'調整的是一樣的。 –