我開始學習 C 并且我正在使用文本檔案。從它們加載文本,使用它,然后在同一個檔案中更新它。有人告訴我 fseek() 不能保證每次都在文本檔案中作業,我無法真正理解為什么。如果有人可以解釋這一點,那就太好了!!
我還發現如果你這樣做
pos = ftell(file);
fseek(pos);
它保證將指標移動到“pos”。這是正確的嗎?
uj5u.com熱心網友回復:
ffseek() 用于將與給定檔案關聯的檔案指標移動到特定位置。 語法 :fseek(FILE *pointer, long int offset, int position),offset:從位置偏移的位元組數,位置:從哪里開始的位置添加偏移量。position 定義檔案指標需要移動的點。它有三個值: SEEK_END :它表示檔案的結尾。SEEK_SET :它表示檔案的開始。SEEK_CUR :表示檔案指標的當前位置。// 將指標移到末尾 我們需要指定位置 fseek(fp, 0, SEEK_END); // 列印指標位置
printf("%ld", ftell(fp)); 你回傳的東西也是寫,但指定偏移位置要好得多
uj5u.com熱心網友回復:
有人告訴我,
fseek()不能保證每次都在文本檔案中作業。
這是事實,但需要解釋:
一些遺留系統使用多個位元組來編碼文本檔案中的行尾,或者其他一些方案,例如固定長度的記錄......這使得檔案偏移量與從流中讀取的位元組數不同。其實有些檔案偏移量在文本檔案中是沒有意義的,比如/序列中LF位元組的偏移量。此功能在寫入文本檔案時也是一個問題,在更新模式下使用相同的流指標讀取和寫入同一檔案時更是如此。CRLF
這在 Unix 系統上從來都不是問題,在 Unix 系統中,文本檔案和二進制檔案只是由單個換行位元組表示的位元組序列和行尾。
在將 C 語言移植到其他作業系統時,編譯器供應商想出了各種精心設計的技巧來處理將系統特定行尾轉換為單個'\n'位元組的問題。
由于這些技巧是系統特定的,甚至是供應商特定的,因此在 1989 年 ANSI 起草第一個 C 標準時,沒有標準方法可以標準化。他們只是就mode 引數的b標志達成一致,fopen()并洗掉了對ftell()超出簡單約束的回傳值含義的任何約束:
C19 7.21.9.2
fseek函式概要
#include <stdio.h> int fseek(FILE *stream, long int offset, int whence);描述
該
fseek函式為 指向的流設定檔案位置指示符stream。如果發生讀取或寫入錯誤,則流的錯誤指示符將設定并fseek失敗。對于二進制流,新位置(以檔案開頭的字符為單位)是通過添加
offset到由 指定的位置獲得的whence。如果whence是SEEK_SET,則指定的位置是檔案的開頭,如果是,則是檔案位置指示符的當前值,如果是,則是檔案SEEK_CUR結束SEEK_END。二進制流不需要有意義地支持值為 的fseek呼叫。whenceSEEK_END對于文本流,要么
offset應為零,要么offset應為較早成功呼叫ftell與同一檔案關聯的流上的函式所回傳的值,并且whence應為SEEK_SET.
請注意,fseek(pos);在您的問題中是不正確的,因為缺少流和 wherece 引數。你應該寫:
long pos = ftell(file);
...
fseek(file, pos, SEEK_SET); // move back to position <pos>
但是請注意,這fseek()可能因其他原因而失敗:并非所有流都支持查找,例如管道、終端連接和其他字符設備...檔案偏移可能超出 type 的范圍long,尤其是在舊系統上,如果可用,fgetpos()/fsetpos()是首選替代方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/334144.html
