<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # C 文件處理 > 原文: [https://www.programiz.com/c-programming/c-file-input-output](https://www.programiz.com/c-programming/c-file-input-output) #### 在本教程中,您將學習 C 語言中的文件處理。您將學習在示例的幫助下使用`fprintf()`,`fscanf()`,`fread()`,`fwrite()`,`fseek()`等在 C 中處理標準 I/O。 文件是計算機存儲設備中用于存儲數據的容器。 * * * ## 為什么需要文件? * 當程序終止時,所有數據都會丟失。 即使程序終止,存儲在文件中也會保留您的數據。 * 如果必須輸入大量數據,則將花費大量時間來全部輸入。 但是,如果您有一個包含所有數據的文件,則可以使用 C 中的一些命令輕松訪問該文件的內容。 * 您可以輕松地將數據從一臺計算機移動到另一臺計算機,而無需進行任何更改。 * * * ## 文件類型 處理文件時,您應該了解兩種類型的文件: 1. 文本文件 2. 二進制文件 ### 1.文本文件 文本文件是普通的`.txt`文件。 您可以使用任何簡單的文本編輯器(例如記事本)輕松創建文本文件。 打開這些文件時,您將以純文本形式看到文件中的所有內容。 您可以輕松地編輯或刪除內容。 它們以最少的維護工作,易于讀取,提供最少的安全性并占用更大的存儲空間。 ### 2.二進制文件 二進制文件主要是計算機中的`.bin`文件。 它們不是以純文本格式存儲數據,而是以二進制格式(0 和 1)存儲數據。 與文本文件相比,它們可以容納更多數據,不易讀取,并提供更好的安全性。 * * * ## 文件操作 在 C 中,您可以對文件執行四個主要操作,即文本或二進制: 1. 創建一個新文件 2. 打開現有文件 3. 關閉文件 4. 讀取信息并將信息寫入文件 * * * ## 處理文件 處理文件時,需要聲明文件類型的指針。 文件和程序之間的通信需要此聲明。 ```c FILE *fptr; ``` * * * ## 打開文件 - 用于創建和編輯 使用`stdio.h`頭文件中定義的`fopen()`函數執行打開文件。 在標準 I/O 中打開文件的語法為: ```c ptr = fopen("fileopen","mode"); ``` 例如, ```c fopen("E:\\cprogram\\newprogram.txt","w"); fopen("E:\\cprogram\\oldprogram.bin","rb"); ``` * 假設文件`newprogram.txt`在位置`E:\cprogram`中不存在。 第一個函數創建一個名為`newprogram.txt`的新文件,并根據`'w'`模式打開該文件進行寫入。 寫入模式允許您創建和編輯(覆蓋)文件的內容。 * 現在,我們假設第二個二進制文件`oldprogram.bin`存在于位置`E:\cprogram`中。 第二個函數打開現有文件,以二進制模式`'rb'`讀取。 讀取模式僅允許您讀取文件,而不能寫入文件。 標準 I/O 中的打開模式 | 模式 | 模式的含義 | 文件不存在期間 | | --- | --- | --- | | `r` | 打開以讀取。 | 如果文件不存在,則`fopen()`返回`NULL`。 | | `rb` | 打開以二進制模式讀取。 | 如果文件不存在,則`fopen()`返回`NULL`。 | | `w` | 打開以寫入。 | 如果文件存在,其內容將被覆蓋。如果文件不存在,將創建它。 | | `wb` | 打開以二進制方式寫入。 | 如果文件存在,其內容將被覆蓋。如果文件不存在,將創建它。 | | `a` | 打開進行附加。數據添加到文件末尾。 | 如果文件不存在,將創建它。 | | `ab` | 打開以二進制方式附加。數據添加到文件末尾。 | 如果文件不存在,將創建它。 | | `r+` | 打開以讀取和寫入。 | 如果文件不存在,則`fopen()`返回`NULL`。 | | `rb+` | 打開以二進制方式讀取和寫入。 | 如果文件不存在,則`fopen()`返回`NULL`。 | | `w+` | 打開以讀取和寫入。 | 如果文件存在,其內容將被覆蓋。如果文件不存在,將創建它。 | | `wb+` | 打開以二進制方式讀取和寫入。 | 如果文件存在,其內容將被覆蓋。如果文件不存在,將創建它。 | | `a+` | 打開以讀取和附加。 | 如果文件不存在,將創建它。 | | `ab+` | 打開以讀取和附加二進制模式。 | 如果文件不存在,將創建它。 | * * * ## 關閉文件 讀取/寫入后,應關閉文件(文本文件和二進制文件)。 使用`fclose()`函數關閉文件。 ```c fclose(fptr); ``` 在此,`fptr`是與要關閉的文件相關聯的文件指針。 * * * ## 讀取和寫入文本文件 為了讀取和寫入文本文件,我們使用函數`fprintf()`和`fscanf().` 它們只是`printf()`和`scanf()`的文件版本。 唯一的區別是`fprint()`和`fscanf()`需要指向結構`FILE`的指針。 * * * ### 示例 1:寫入文本文件 ```c #include <stdio.h> #include <stdlib.h> int main() { int num; FILE *fptr; // use appropriate location if you are using MacOS or Linux fptr = fopen("C:\\program.txt","w"); if(fptr == NULL) { printf("Error!"); exit(1); } printf("Enter num: "); scanf("%d",&num); fprintf(fptr,"%d",num); fclose(fptr); return 0; } ``` 該程序從用戶那里獲取一個號碼,并將其存儲在文件`program.txt`中。 編譯并運行該程序后,您會看到在計算機的 C 驅動器中創建的文本文件`program.txt`。 打開文件時,您可以看到輸入的整數。 * * * ### 示例 2:讀取文本文件 ```c #include <stdio.h> #include <stdlib.h> int main() { int num; FILE *fptr; if ((fptr = fopen("C:\\program.txt","r")) == NULL){ printf("Error! opening file"); // Program exits if the file pointer returns NULL. exit(1); } fscanf(fptr,"%d", &num); printf("Value of n=%d", num); fclose(fptr); return 0; } ``` 該程序讀取`program.txt`文件中存在的整數并將其打印到屏幕上。 如果您從**示例 1** 成功創建了文件,運行此程序將為您提供輸入的整數。 其他函數,例如`fgetchar()`,`fputc()`等也可以類似的方式使用。 * * * ## 讀寫二進制文件 對于二進制文件,函數`fread()`和`fwrite()`分別用于讀取和寫入磁盤上的文件。 * * * ### 寫入二進制文件 要寫入二進制文件,需要使用`fwrite()`函數。 這些函數采用四個參數: 1. 要寫入磁盤的數據地址 2. 要寫入磁盤的數據大小 3. 此類數據的數量 4. 指向要寫入的文件的指針。 ```c fwrite(addressData, sizeData, numbersData, pointerToFile); ``` * * * ### 示例 3:使用`fwrite()`寫入二進制文件 ```c #include <stdio.h> #include <stdlib.h> struct threeNum { int n1, n2, n3; }; int main() { int n; struct threeNum num; FILE *fptr; if ((fptr = fopen("C:\\program.bin","wb")) == NULL){ printf("Error! opening file"); // Program exits if the file pointer returns NULL. exit(1); } for(n = 1; n < 5; ++n) { num.n1 = n; num.n2 = 5*n; num.n3 = 5*n + 1; fwrite(&num, sizeof(struct threeNum), 1, fptr); } fclose(fptr); return 0; } ``` 在此程序中,我們在 C 驅動器中創建一個新文件`program.bin`。 我們用三個數字 - `n1`,`n2`和`n3`聲明結構`threeNum`,并在主函數中將其定義為`num`。 現在,在`for`循環中,我們使用`fwrite()`將值存儲到文件中。 第一個參數采用`num`的地址,第二個參數采用結構`threeNum`的大小。 由于我們僅插入一個`num`的實例,因此第三個參數是`1`。 并且,最后一個參數`*fptr`指向我們正在存儲數據的文件。 最后,我們關閉文件。 * * * ### 從二進制文件讀取 函數`fread()`也采用 4 個自變量,類似于上面的`fwrite()`函數。 ```c fread(addressData, sizeData, numbersData, pointerToFile); ``` * * * ### 示例 4:使用`fread()`從二進制文件讀取 ```c #include <stdio.h> #include <stdlib.h> struct threeNum { int n1, n2, n3; }; int main() { int n; struct threeNum num; FILE *fptr; if ((fptr = fopen("C:\\program.bin","rb")) == NULL){ printf("Error! opening file"); // Program exits if the file pointer returns NULL. exit(1); } for(n = 1; n < 5; ++n) { fread(&num, sizeof(struct threeNum), 1, fptr); printf("n1: %d\tn2: %d\tn3: %d", num.n1, num.n2, num.n3); } fclose(fptr); return 0; } ``` 在此程序中,您將讀取同一文件`program.bin`,并逐個循環瀏覽記錄。 簡單來說,就是從`* fptr`指向的文件中讀取`threeNum`大小的`threeNum`記錄到結構`num`中。 您將獲得與在**示例 3** 中插入的記錄相同的記錄。 * * * ## 使用`fseek()`獲取數據 如果文件中有很多記錄,并且需要訪問特定位置的記錄,則需要遍歷所有記錄才能獲取該記錄。 這將浪費大量的內存和操作時間。 使用`fseek()`可以更輕松地獲取所需數據。 顧名思義,`fseek()`將光標定位到文件中的給定記錄。 * * * ### `fseek()`的語法 ```c fseek(FILE * stream, long int offset, int whence); ``` 第一個參數流是指向文件的指針。 第二個參數是要查找的記錄的位置,第三個參數指定偏移量開始的位置。 `fseek()`中的不同`whence` | `whence` | 含義 | | --- | --- | | `SEEK_SET` | 從文件開頭開始偏移。 | | `SEEK_END` | 從文件末尾開始偏移。 | | `SEEK_CUR` | 從文件中光標的當前位置開始偏移。 | * * * ### 示例 5:`fseek()` ```c #include <stdio.h> #include <stdlib.h> struct threeNum { int n1, n2, n3; }; int main() { int n; struct threeNum num; FILE *fptr; if ((fptr = fopen("C:\\program.bin","rb")) == NULL){ printf("Error! opening file"); // Program exits if the file pointer returns NULL. exit(1); } // Moves the cursor to the end of the file fseek(fptr, -sizeof(struct threeNum), SEEK_END); for(n = 1; n < 5; ++n) { fread(&num, sizeof(struct threeNum), 1, fptr); printf("n1: %d\tn2: %d\tn3: %d\n", num.n1, num.n2, num.n3); fseek(fptr, -2*sizeof(struct threeNum), SEEK_CUR); } fclose(fptr); return 0; } ``` 該程序將以相反的順序(從最后到第一)開始從文件`program.bin`中讀取記錄并進行打印。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看