您好,登錄后才能下訂單哦!
這篇文章主要講解了“C語言如何實現隨機讀寫文件”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C語言如何實現隨機讀寫文件”吧!
前面已經劇透過了,fseek可以改變記錄讀寫位置的指針的指向,從而實現文件的隨機讀寫。該函數的聲明如下:
int fseek ( FILE * stream, long int offset, int origin );
第一個參數大家都很熟悉了,就是一個文件指針,告訴fseek我現在操作的是哪個文件。
第二個參數,offset是偏移量的意思,大家先記住。第三個參數,origin,顧名思義,即“起始位置”。后面兩個參數讓人摸不著頭腦,但是配合起來就很有意思了。
舉個例子:假設一個文件中存有abcdefg,當你用fopen打開這個文件時,一個記錄讀寫位置的指針就指向了起始位置,也就是指向了a。如果我想讀取第5個字符,即e呢?那我就要讓這個指針指向e,這樣再fgetc就能讀到e了。
我可以這樣算:e相對于起始位置a,向右偏移了4個字符,因為相對于a,a自己的偏移量是0,b是1,c是2,d是3,e自然是4。那么,偏移量offset(fseek的第二個參數)就是4,這個4是相對于起始位置的,這個“相對于”哪里,也就是origin(fseek的第三個參數)的位置,此時origin就是“起始位置”,明白了吧。而fseek用一個宏SEEK_SET來表示“起始位置”,所以此時fseek的調用如下:
fseek(pf, 4, SEEK_SET);
下面我們來驗證一下。先在工程目錄下創建一個文件,文件名是test.txt,然后在里面輸入abcdefg。
按照打開文件->讀文件->關閉文件的順序,寫代碼:
#include <stdio.h> int main() { FILE* pf = fopen("test.txt", "r"); if (pf == NULL) { perror("fopen"); return 1; } fseek(pf, 4, SEEK_SET); putchar(fgetc(pf)); fclose(pf); pf = NULL; return 0; }
打開文件后,使用fseek讓記錄讀寫位置的指針指向e,接著用fgetc讀取e并用putchar打印出來,輸出結果如下:
我們就成功跳過了前面的abcd,直接讀取到e,實現了文件的隨機讀寫。
當然,讀取到e不止有這一種寫法。fseek的第三個參數origin有三種取值,分別是:
1.SEEK_SET,表示起始位置。
2.SEEK_CUR,表示當前指向的位置。
3.SEEK_END,表示文件末尾。
SEEK_SET和SEEK_CUR都很好理解,需要注意的是,SEEK_END不是指向最后一個字符,而是指向最后一個字符的下一個位置。比如,一個文件中存有abcdefg,SEEK_END不是指向g,而是指向g的下一個位置。所以同樣是讀到e,如果origin是SEEK_END,offset就應該是-3,因為g的偏移量是-1,f是-2,所以e是-3。把上面代碼中的fseek的調用方式改一下,其他不變:
fseek(pf, -3, SEEK_END);
也可以讀到e,因為在執行完上面這行代碼后,記錄讀寫位置的指針就指向了e,所以讀取時就跳過了前面的abcd,直接讀到e。說明一下,由于讀寫前該指針指向了e,調用fgetc讀完e后,該指針就指向了e后面的f,也就是說,此時SEEK_CUR就指向了f,如果我們想讀到b呢?可以數一下,abcdefg,b相對于SEEK_CUR(指向f)的偏移量就是-4,如果像下面的代碼這樣寫:
#include <stdio.h> int main() { FILE* pf = fopen("test.txt", "r"); if (pf == NULL) { perror("fopen"); return 1; } fseek(pf, -3, SEEK_END); // 指向e putchar(fgetc(pf)); // 讀完e后指向f fseek(pf, -4, SEEK_CUR); // 指向b putchar(fgetc(pf)); // 讀完b后指向c fclose(pf); pf = NULL; return 0; }
輸出結果如下:
我如果想知道此時記錄讀寫位置的指針相對于起始位置的偏移量(即相對于SEEK_SET的偏移量)是多少,就可以問問ftell函數。該函數聲明如下:
long int ftell ( FILE * stream );
ftell會返回當前相對于起始位置的偏移量。比如前面的例子中調用:
#include <stdio.h> int main() { FILE* pf = fopen("test.txt", "r"); if (pf == NULL) { perror("fopen"); return 1; } fseek(pf, -3, SEEK_END); // 指向e putchar(fgetc(pf)); // 讀完e后指向f fseek(pf, -4, SEEK_CUR); // 指向b putchar(fgetc(pf)); // 讀完b后指向c printf("\n%ld\n", ftell(pf)); fclose(pf); pf = NULL; return 0; }
由于此時記錄文件讀寫位置的指針指向了c,偏移量是2(a為0,b為1,c為2),所以會輸出2。
rewind的作用是,讓指向文件讀寫位置的指針指向文件的起始位置。該函數聲明如下:
void rewind ( FILE * stream );
其實非常簡單,rewind(pf);和fseek(pf, 0, SEEK_SET);是等價的。
在前面的例子中,記錄文件讀寫位置的指針左右橫跳,最后指向了c,此時ftell也返回了2,這時如果我rewind一下,該指針就又指向了起始位置,即a,再ftell就能知道偏移量回到了0,如果再fgetc,就能重新讀取到a了。代碼如下:
#include <stdio.h> int main() { FILE* pf = fopen("test.txt", "r"); if (pf == NULL) { perror("fopen"); return 1; } fseek(pf, -3, SEEK_END); // 指向e putchar(fgetc(pf)); // 讀完e后指向f fseek(pf, -4, SEEK_CUR); // 指向b putchar(fgetc(pf)); // 讀完b后指向c printf("\n%ld\n", ftell(pf)); rewind(pf); printf("%ld\n", ftell(pf)); putchar(fgetc(pf)); // a fclose(pf); pf = NULL; return 0; }
輸出結果:
當然,把上述代碼中的rewind(pf);換成fseek(pf, 0, SEEK_SET);的效果是一樣的。
感謝各位的閱讀,以上就是“C語言如何實現隨機讀寫文件”的內容了,經過本文的學習后,相信大家對C語言如何實現隨機讀寫文件這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。