日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【C语言重点难点精讲】C语言文件

發布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C语言重点难点精讲】C语言文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一:文件相關概念
    • (1)什么是文件
    • (2)文件名
    • (3)文件類型
  • 二:文件指針
  • 三:文件的打開和關閉
  • 四:文件的順序讀寫
    • (1)寫
    • (2)讀
  • 五:文件的隨機讀取
    • (1)fseek
    • (2)ftell
    • (3)rewind
  • 六:文件結束條件判定
  • 七:其它注意點

一:文件相關概念

(1)什么是文件

我們在磁盤上所見到的都是文件,在程序設計中,所談到文件主要有兩種:

  • 一種是程序文件:包括源程序文件(后綴為.c),目標文件(windows環境后綴為.obj),可執行程序(windows環境后綴為.exe);
  • 另一種是數據文件:文件的內容不一定是程序,也可以是程序運行時讀寫的數據,比如程序運行需要從中讀取數據的文件,或者輸出內容的文件

本節主要討論的是數據文件

(2)文件名

一個文件有“文件路徑+文件主干+文件后綴”三部分組成,為了方便起見,文件表示也被稱為文件名

(3)文件類型

數據文件可以被分為文本文件二進制文件

  • 舉個例子,程序里有個變量是10000,如果要把它放到磁盤里,你想要讓用戶讀懂那么你肯定要用字符表示,也就是1對應的ASCII碼,2對應的ASCII碼,這樣去轉換,那么這種就是文本。如果不經過任何轉換,就是二進制文件(使用記事本方式打開exe文件時的亂碼)

如下程序代碼表示將數字10000用存儲為二進制文件

int main() {int a = 10000;FILE* pf = fopen("test.txt", "wb");fwrite(&a, 4, 1, pf)//二進制寫fclose(pf);pf = NULL;return 0; }

雖然顯示的是txt文件,但是其本質是二進制文件,所以用記事本打開是亂碼

要去看到到底是什么,可以用VS,使用二進制編輯器打開

二:文件指針

每一個使用的文件,在內存中都會開辟一個文件信息區,這個文件信息區存放的是文件的名字,文件的狀態等等,所有的這些信息存放在一個結構體變量中,將其取名為FILE

既然它是結構體變量,那么我們就可以創建一個指針去操作它,這個指針也就被稱為文件指針

FILE* pf;//文件指針

pf是一個指向FILE類型的數據變量,可以使pf指向某個文件的文件信息區(是一個結構體變量)。通過該文件信息區中的信息就可以訪問該文件

三:文件的打開和關閉

文件讀寫時先打開文件,再關閉文件
在打開文件的時候,會返回一個File*的指針,C語言規定使用fopen打開文件,fclose關閉文件

FILE* fopen(const char* filename,const char* mode); int fclose(FILE* stream)

mode選項有如下幾種

int main() { FILE* pf = fopen("test.txt", "r"); if (pf == NULL) {printf("%s\n", strerror(errno));return 0; } fclose(pf); pf == NULL; return 0; }

四:文件的順序讀寫

讀寫函數如下

注意標準輸入流和標準輸入流

int main() {char arr[1024] = { 0 };fgets(arr, 1024, stdin);//鍵盤就是標準輸入流fputs(arr, stdout);//屏幕是標準輸出流 }

注意這幾組函數

  • scanf和printf是針對標準輸入/輸出流的格式化輸入/輸出語句
  • fscanf和fprintf是針對所有輸入/輸出流的格式化輸入/輸出語句
  • sscanf是從字符串中讀取格式化的數據
  • sprintf是把格式化數據輸出到字符串

(1)寫

1:字符輸出

int main() {FILE* pfwrite = fopen("test.txt", "w");if (pfwrite == NULL) {printf("%s\n", strerror(errno);return 0;}fputc('L', pfwrite);fputc('o', pfwrite);fputc('v', pfwrite);fputc('E', pfwrite);fclose(pfwrite);pfwrite = NULL;return 0; }

2:文本行輸出,其中換行需要手動加入

int main() {FILE* pfwrite = fopen("test.txt", "w");if (pfwrite == NULL) {printf("%s\n", strerror(errno));return 0;}fputs("I\n", pfwrite);fputs("LOVE\n", pfwrite);fputs("YOU", pfwrite);return 0; }

3:格式化輸出

struct S {int n;float score;char arr[10]; };int main() {struct S s = { 100,3.14f,"love" };FILE* pfwrite = fopen("test.txt", "w");if (pfwrite == NULL) {printf("%s\n", strerror(errno));return 0;}fprintf(pfwrite, "%d-%f-%s", s.n, s.score, s.arr);//格式化輸出return 0; }

4:二進制輸出

struct S {char arr[10];int age; };int main() {struct S s = { "Bob",19};FILE* pfwrite = fopen("test.txt", "wb");//二進制if (pfwrite == NULL) {printf("%s\n", strerror(errno));return 0;}fwrite(&s, sizeof(struct S), 1, pfwrite);return 0; }

(2)讀

1:字符讀入

int main() {FILE* pfread = fopen("test.txt", "r");if (pfread == NULL) {printf("%s\n", strerror(errno));return 0;}printf("%c", fgetc(pfread));printf("%c", fgetc(pfread));printf("%c", fgetc(pfread));printf("%c", fgetc(pfread));printf("%c", fgetc(pfread));return 0; }

2:文本行輸入,可以獲得換行符

int main() {FILE* pfread = fopen("test.txt", "r");if (pfread == NULL) {printf("%s\n", strerror(errno));return 0;}char a[20];fgets(a, 6, pfread);//讀一行6個字符printf("%s\n", a);return 0; }

3:格式化輸入

struct S {int n;float score;char arr[10]; };int main() {struct S s = { 0 };FILE* pfread = fopen("test.txt", "r");if (pfread == NULL) {printf("%s\n", strerror(errno));return 0;}fscanf(pfread, "%d%f%s", &(s.n), &(s.score), &(s.arr));printf("%d-%f-%s", s.n, s.score, s.arr);return 0; }

4:二進制輸入

int main() {struct S s = { 0 };FILE* pfread = fopen("test.txt", "rb");//二進制if (pfread == NULL) {printf("%s\n", strerror(errno));return 0;}fread(&s, sizeof(struct S), 1, pfread);printf("%d-%f-%s", s.n, s.score, s.arr);return 0; }

五:文件的隨機讀取

(1)fseek

文件指針開始會指向文件內容的開頭,順序讀取時想要讀取某個特定字符時,必須先讀其前面的字符,而使用隨機讀取,可以直接偏移文件指針,直接讀取
需要注意,在讀取完成后文件指針會自動向后偏移

  • SEEL_CUR:以文件指針的當前位置偏移
  • SEEK_END:以文件的末尾位置偏移
  • SEEK_SET:以文件的起始位置開始
int main() {FILE* pfread = fopen("test.txt", "r");if (pfread == NULL) {printf("%s\n", strerror(errno));return 0;}fseek(pfread, 2, SEEK_CUR);//以當前位置偏移整數printf("%c\n", fgetc(pfread));return 0; }

(2)ftell

返回當前文件指針相對于起始位置的偏移量

int main() {FILE* pfread = fopen("test.txt", "r");if (pfread == NULL) {printf("%s\n", strerror(errno));return 0;}fgetc(pfread);//讀取一個跳過一個int pos = ftell(pfread);printf("%d\n", pos);fclose(fread);return 0; }

(3)rewind

讓文件指針回到起始位置

int main() {FILE* pfread = fopen("test.txt", "r");if (pfread == NULL) {printf("%s\n", strerror(errno));return 0;}fgetc(pfread);//讀取一個跳過一個int pos1 = ftell(pfread);rewind(pfread);//回到其實位置int pos2 = ftell(pfread);printf("%d\n", pos2);//結果仍然是0fclose(fread);return 0; }

六:文件結束條件判定

對于fgetc,如果其返回值為EOF;對于fgets,如果其返回值為NULL,就代表文件讀到末尾
需要特別注意的一點是千萬不要用feof判斷文件結束

下面是讀到文件末尾的標準寫法

while ((c = fgetc(fp)) != EOF) {//操作 }

七:其它注意點

1:flcose函數在文件成功關閉時返回0,關閉失敗時返回EOF

2:當文件到達末尾時,feof返回的是非0,沒有到達則返回0

3:使用getchar()輸入字符時,是先將所有字符送入緩沖區,直到鍵入回車換行符才從緩沖區逐個讀出并賦值給變量

4:fgets從fp所指的文件中讀取字符串并在字符串末尾添加’\0’,然后存入s,最多讀n-1個字符

5:fgets在出錯和到達文件末尾返回都是NULL,所以應該用ferror來確定它返NULL的原因是什么

  • 函數ferror用來檢測是否出現文件錯誤,如果出現,函數返回非0值,沒有錯誤,返回0值

6:fputs出現寫入錯誤,返回EOF,成功返回一個非負數

7:與gets()不同的是,fgets()從指定的流讀字符串,讀到換行符時將換行符也作為字符串的一部分讀到字符串。同理,與puts()不同的是,fputs()不會在寫入文件的字符串末尾自動加上換行符

8:函數fseek調用成功,返回0,否則返回非0

9:fopen發生錯誤時,返回0

總結

以上是生活随笔為你收集整理的【C语言重点难点精讲】C语言文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。