文件操作知識點總結

目錄

1.為什么使用文件

2.什么是文件?

2.1 程序文件

2.2 數據文件

2.3 文件名

3.二進制文件和文本文件

4.文件的打開和關閉

4.1 流和標準流

4.1.1 流

4.1.2 標準流

4.2 文件指針

4.3 文件的打開和關閉

4.3.1 fopen函數

4.3.2 fclose函數

5.文件的順序讀寫

5.1 fputc函數

5.2 fgetc函數

5.3 feof和ferror函數

5.4 fputs函數

5.5 fgets函數

5.6 fprintf函數

5.7 fscanf函數

5.8 fwrite函數

5.9 fread函數

5.10 對比一組函數

5.10.1 sprintf函數

5.10.2 fscanf函數

6.文件的隨機讀寫

6.1 fseek函數

6.2 ftell函數

6.3 rewind函數

7.文件緩沖區

7.1 fflush函數

8.更新文件


1.為什么使用文件

如果沒有文件,我們寫的程序的數據是存儲在電腦內存中,如果程序退出,內存回收,數據就會丟失了,等再次運行程序,是看不到上次程序的結構的,如果要將數據進行持久化的保存,我們可以使用文件。

2.什么是文件?

磁盤,就是硬盤上的文件是文件。

但是我們在設計程序的時候,一般有兩種文件:程序文件、數據文件。

2.1 程序文件

程序文件包括源程序文件(后綴為.c),目標文件(后綴為.obj)和可執行程序(后綴為.exe)。

2.2 數據文件

文件的內容不一定是程序,而是程序運行時讀寫的數據,比如程序運行需要從文中讀取數據的文件,或者輸出內容的文件。

2.3 文件名

一個文件要有一個唯一的文件標識,以便用戶識別和引用。

文件名包含3部分:文件路徑+文件名主干+文件后綴。

文件標識常被稱為文件名。

3.二進制文件和文本文件

根據數據的組織形式,數據文件被分為文本文件二進制文件

數據在內存中以二進制的形式存儲,如果不加轉換的輸出到外存的文件中,就是二進制文件。

如果要求在外存上以ASCII碼的形式存儲,則需要在存儲前轉換。以ASCII字符的形式存儲的文件就是文本文件。

字符一律以ASCII形式存儲,數值型數據既可以用ASCII形式存儲,也可以使用二進制形式存儲。

4.文件的打開和關閉

4.1 流和標準流

4.1.1 流

我們程序的數據需要輸出到各種外部設備,也需要從外部設備獲取數據,不同的外部設備的輸入和輸出操作各不相同。

C程序針對文件、畫面、鍵盤等的數據輸入輸出操作都是通過流操作的。

一般情況下,我們要想向流里寫數據,或者從流中讀取數據,都是需要打開流,然后操作。

4.1.2 標準流

那為什么從鍵盤輸入數據,并沒有打開流呢?

因為C語言程序啟動時,默認打開了3個流:

(1)stdin---標準輸入流,在大多數的環境中從鍵盤輸入,scanf函數就是從標準輸入流中讀取數據。

(2)stdout---標準輸出流,大多數環境中輸出至顯示器界面,printf函數就是將信息輸出到標準輸出流中。

(3)stderr---標準錯誤流,大多數環境中輸出到顯示器界面。

stdin、stdout、stderr三個流的類型是:FILE*,通常稱為文件指針。

C語言中,就是通過FILE*的文件指針來維護流的各種操作的。

4.2 文件指針

緩沖文件系統中,關鍵的概念是“文件類型指針”,簡稱“文件指針”。

每個被使用的文件都在內存中開辟了一個相應的文件信息區,用來存放文件的相關信息。這些信息是保存在一個結構體變量中的。該結構體類型是由系統聲明的,取名FILE。

不同的C編譯器的FILE類型包含的內容不完全相同,但是大同小異。

FILE* pf;//文件指針變量

定義pf是一個指向FILE類型數據的指針變量。可以使pf指向某個文件的文件信息區(是一個結構體變量)。通過該文件信息區中的信息就能夠訪問該文件。也就是說,通過文件指針變量能夠間接找到與它關聯的文件。

4.3 文件的打開和關閉

文件在讀取之前應該先打開文件,在使用結束之后應該關閉文件。

在編寫程序的時候,再打開文件的同時,都會返回一個FILE*的指針變量指向該文件,也相當于建立了指針和文件的關系。

ANSI C規定使用fopen函數來打開文件,fclose來關閉文件。

4.3.1 fopen函數

FILE* fopen(const char* filename, const char* mode);

功能:fopen函數是用來打開參數filename指定的文件,同時將打開的文件和一個流進行關聯,后續對流的操作是通過fopen函數返回的指針來維護。具體對流(關聯的文件)的操作是通過參數mode來指定的。

參數:

(1)filename:表示被打開的文件的名字,這個名字可以絕對路徑,也可以是相對路徑。

(2)mode:表示對打開的文件的操作方式。

返回值:

(1)若文件成功打開,該函數將返回一個指向FILE對象的指針,該指針可用于后續操作中標識對應的流。

(2)若打開失敗,則返回NULL指針,所以一定要fopen的返回值做判斷,來驗證文件是否打開成功。

示例:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}printf("文件打開成功\n");//關閉文件return 0;
}

結果:

4.3.2 fclose函數

int fclose(FILE* stream);

功能:關閉參數stream關聯的文件,并取消其關聯關系。與該流關聯的所有內部緩沖區均會解除關聯并刷新:任何未寫入的輸出緩沖區內容將被寫入,任何未讀取的輸入緩沖區內容將被丟棄。

參數:

stream:指向要關閉的流的FILE對象的指針。

返回值:成功關閉stream指向的流會返回0,否則會返回EOF。

示例:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}//寫文件//關閉文件fclose(pf);pf = NULL;return 0;
}

5.文件的順序讀寫

5.1 fputc函數

int fputc(int character, FILE* stream);

功能:將參數character指定的字符寫入到stream指向的輸入流中,通常用于向文件或標準輸出流寫入字符。在寫入字符之后,還會調整指示器。字符會被寫入流內部位置指示器當前指向的位置,隨后該指示器自動向前移動一個位置。

參數:

character:被寫入字符。

stream:是一個FILE*類型的指針,指向了輸出流(通常是文件流或stdout)。

返回值:

1.成功時返回寫入字符(以int形式)。

2.失敗時返回EOF(通常是-1),錯誤指示器會被設置,可通過ferror()檢查具體錯誤。

示例:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}fputc('a', pf);fputc('b', pf);fputc('c', pf);fputc('d', pf);fclose(pf);pf = NULL;return 0;
}

輸出結果:

用循環的方式:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}int i = 0;for (i = 'a'; i <= 'z'; i++){fputc(i, pf);}fclose(pf);pf = NULL;return 0;
}

輸出結果:

5.2 fgetc函數

int fgetc(FILE* stream);

功能:從參數stream指向的流中讀取一個字符。函數返回的是文件指示器當前指向的字符,讀這個字符之后,文件指示器自動前進到下一個字符。

參數:

stream:FILE*類型的文件指針,可以是stdin,也可以是其他輸入流的指針。如果是stdin就從標準輸入流讀取數據。如果是文件流指針,就從文件讀取數據。

返回值:

1.成功時返回讀取的字符(以int形式)。

2.若調用時流已處于文件末尾,函數返回EOF并設置流的文件結束指示器(feof)。

若發生讀取錯誤,函數返回EOF并設置流的錯誤指示器(ferror)。

代碼演示:

data.txt里保存有26個英文字母。

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}int i = 0;for (i = 0; i < 10; i++){int ch = fgetc(pf);fputc(ch, stdout);}fclose(pf);pf = NULL;return 0;
}

輸出結果:

5.3 feof和ferror函數

int feof(FILE* stream);
//檢測stream指針指向的流是否遇到文件末尾。int ferror(FILE* stream);
//檢測stream指針指向的流是否發生讀/寫錯誤。

如果在讀取文件的過程中,遇到了文件末尾,文件讀取就會結束。這時讀取函數會在對應的流上設置一個文件結束的標識符,這個文件結束指示符可以通過feof函數檢測到。如果feof函數檢測到文件結束指示符已經被設置,則返回非0的值,如果沒有設置則返回0。

如果在讀/寫文件的過程中,發生了讀/寫錯誤,文件讀取就會結束。這是讀/寫函數會在對應的流上設置一個錯誤指示符,這個錯誤指示符可以通過ferror函數檢測到。如果ferror函數檢測到錯誤指示符已經被設置,則返回非0的值,如果沒有設置則返回0。

測試feof函數:

假設data.txt文件里存放的abcdef。

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}int i = 0;for (i = 0; i < 10; i++){int c = fgetc(pf);if (c == EOF){if (feof(pf)){printf("遇到文件末尾了\n");}else if (ferror(pf)){printf("讀取發生錯誤\n");}}else{fputc(c, stdout);}}fclose(pf);pf = NULL;return 0;
}

輸出結果:

測試ferror函數:

假設data.txt文件里存放的abcdef。

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}int c = fgetc(pf);if (c == EOF){if (feof(pf)){printf("遇到了文件末尾\n");}else if (ferror){printf("讀文件發生錯誤\n");}}else{fputc(c, stdout);}fclose(pf);pf = NULL;return 0;
}

輸出結果:

5.4 fputs函數

int fputs(const char* str, FILE* stream);

功能:將參數str指向的字符串寫入到參數stream指定的流中(不包含結尾的\0),適用于文件流或標準輸出(stdout)。

參數:

(1)str:str是指針,指向了要寫入的字符串(必須以\0結尾)。

(2)stream:是一個FILE*的指針,指向了要寫入字符串的流。

返回值:

(1)成功時返回EOF(-1),同時會設置流的錯誤指示器 ,可以使用ferror()檢查錯誤原因。

代碼演示:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}fputs("abc", pf);fputs("def", pf);fclose(pf);pf = NULL;return 0;
}

輸出結果:

abcdef被寫入文件data.txt。

5.5 fgets函數

char* fgets(char* str, int num, FILE* stream);

功能:從stream指定的輸入流中讀取字符串,至讀取到換行符、文件末尾(EOF)或達到指定字符數(包含結尾的\0),然后將讀取的字符串存儲到str指向的空間中。

參數:

(1)str:是指向字符數組的指針,str指向的空間用于存儲讀取到的字符串。

(2)num:最大讀取字符串(包含結尾的\0,實則最多讀取num-1個字符)。

(3)stream:輸入流的文件指針(如文件流或stdin)。

返回值:

(1)成功時返回str指針。

(2)若在嘗試讀取字符時遇到文件末尾,則設置文件結束指示器,并返回NULL,需通過feof()檢測。

(3)若發生讀取錯誤,則設置流錯誤指示器,并返回NULL,通過ferror()檢測。

代碼演示:

假設:data.txt中的保存的是

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}char arr[20] = "xxxxxxxxxx";fgets(arr, 5, pf);fclose(pf);pf = NULL;return 0;
}

輸出結果:

使用細節:

(1)若讀取到換行符(\n),會將其包含在字符串中(排除超出num-1限制),然后以\0結尾。

(2)文件末尾無換行符時,字符串以\0結尾,不包含\n。

5.6 fprintf函數

int fprintf(FILE* stream, const char* format, ...);

功能:fprintf是將格式化數據寫入指定文件流的函數。它與printf類似,但可以輸出到任意文件(如磁盤文件、標準輸出、標準錯誤等),而不僅限于控制臺。

參數:

(1)stream:指向FILE對象的指針,表示要寫入的文件流(如stdout、文件指針等)。

(2)format:格式化字符串,包含要寫入的文本和格式說明符(如%d、%s等)。

(3)...:可變參數列表,提供與格式化字符串中說明符對應的數據。

返回值:

(1)成功時,返回寫入的字符總數(非負值)。

(2)失敗時,先設置對應流的錯誤指示器,再返回負值,可以通過ferror()來檢測。

代碼演示:

#include<stdio.h>struct S
{char name[30];int age;float score;
};int main()
{struct S s = { "zhangsan",21,95.5f };FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}fprintf(pf, "%s %d %f", s.name, s.age, s.score);fclose(pf);pf = NULL;return 0;
}

輸出結果:

5.7 fscanf函數

int fscanf(FILE* stream, const char* format, ...);

功能:fscanf是從指定文件流中讀取格式化數據的函數。它類似于scanf,但可以指定輸入源(如文件、標準輸入等),而非僅限于控制臺輸入。適用于從文件解析結構化數據(如整數、浮點數、字符串等)。

參數:

(1)stream:指向FILE對象的指針,表示要讀取的文件流(如stdin、文件指針等)。

(2)format:格式化字符串,定義如何解析輸入數據(如%s、%f、%d等)。

(3)...:可變參數列表,提供存儲數據的變量地址(需與格式字符串中的說明符匹配)。

返回值:

(1)成功時,函數返回成功填充到參數列表中的項數。該值可能與預期項數一致,也可能因以下原因少于預期(甚至為0):

? ? · 格式和數據匹配失敗;

? ? · 讀取發生錯誤;

? ? · 到達文件末尾(EOF)。

(2)如果在成功讀取任何數據之前發生:

? ? · 發生讀取錯誤,會在對應流上設置錯誤標識符,則返回EOF。

? ? · 到達文件末尾,會在對應流上設置文件結束標識符,則返回EOF。

代碼示例:

假設data.txt文件中保存了數據:

#include<stdio.h>struct S
{char name[30];int age;float score;
};int main()
{struct S s = { 0 };FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));printf("%s %d %f\n", s.name, s.age, s.score);fclose(pf);pf = NULL;return 0;
}

輸出結果:

5.8 fwrite函數

size_t fwrite(const void* ptr, size_t size, size_t count, FILE* stream);

功能:函數用于將數據塊寫入stream指向的文件流中,是以2進制的形式寫入的。

參數:

(1)ptr:指向要寫入的數據塊的指針。

(2)size:要寫入的每個數據項的大小(以字節為單位)。

(3)count:要寫入的數據項的數量。

(4)stream:指向FILE類型結構體的指針,指定了要寫入數據的文件流。

返回值:返回實際寫入的數據項數量。如果發生錯誤,則返回值可能小于count。

使用注意事項:

(1)在使用fwrite()之前,需要確保文件已經以二進制可寫方式打開。

(2)fwrite()通常用于二進制數據的寫入,如果寫入文本數據,請謹慎處理換行符和編碼等問題。

代碼演示:

#include<stdio.h>struct S
{char name[30];int age;float score;
};int main()
{struct S s = { "zhangsan",21,95.5f };FILE* pf = fopen("data.txt", "wb");if (pf == NULL){perror("fopen");return 1;}fwrite(&s, sizeof(struct S), 1, pf);fclose(pf);pf = NULL;return 0;
}

5.9 fread函數

size_t fread(void* ptr, size_t size, size_t count, FILE* stream);

功能:函數用于從stream指向的文件流中讀取數據塊,并將其存儲到ptr指向的內存緩沖區中。

參數:

(1)ptr:指向內存區域的指針,用于存儲從文件中讀取的數據。

(2)size:要讀取的每個數據塊的大小(以字節為單位)。

(3)count:要讀取的數據塊的數量。

(4)stream:指向FILE類型結構體的指針,指定了要從讀取數據的文件流。

返回值:返回實際讀取的數據塊數量。

使用注意事項:

(1)需要包含頭文件stdio.h。

(2)在使用fread()之前,需要確保文件已經以二進制可讀方式打開。

(3)ptr指向的內存區域必須足夠大,以便存儲指定數量和大小的數據塊。

(4)如果fread()成功讀取了指定數量的數據塊,則返回值等于count;如果讀取數量少于count,則可能已經到達文件結尾或者發生了錯誤。

(5)在二進制文件讀取時,fread()是常用的函數,但對于文本文件讀取,通常使用fgets()或者fscanf()函數。

代碼演示:

假設有一個二進制文件“data.txt”,包含數據上面代碼的數據。

#include<stdio.h>struct S
{char name[30];int age;float score;
};int main()
{struct S s = { 0 };FILE* pf = fopen("data.txt", "rb");if (pf == NULL){perror("fopen");return 1;}size_t r = fread(&s, sizeof(struct S), 1, pf);if (r != 1){if (feof(pf)){printf("遇到文件末尾了\n");}else if (ferror(pf)){printf("讀取發生了錯誤\n");}}else{printf("%s %d %f\n", s.name, s.age, s.score);}fclose(pf);pf = NULL;return 0;
}

輸出結果:

5.10 對比一組函數

scanf/printf:針對標準輸入/標準輸出的格式化的輸入函數和輸出函數。

fscanf/fprintf:針對所有輸入流/所有輸出流的格式化的輸入函數和輸出函數。

5.10.1 sprintf函數

int sprintf(char* str, const char* format, ...);

功能:將格式化的數據寫入字符數據(字符串)。它類似于printf,但輸出目標不是控制臺或文件,而是用戶指定的內存緩沖區。常用于動態生成字符串、拼接數據或轉換數據格式。簡而言之就是將格式化的數據轉換成一個字符串。

參數:

(1)str:指向字符數組的指針,用于存儲生成的字符串(需確保足夠大以防止溢出)。

(2)format:格式化字符串,定義輸出格式(如%d、%f、%s等)。

(3)...:可變參數列表,提供與格式字符串中說明符對應的數據。

返回值:

成功時:返回寫入buffer的字符數(不包括結尾的\0)。

失敗時:返回負值。

代碼演示:

#include<stdio.h>struct S
{char name[30];int age;float score;
};int main()
{struct S s = { "zhangsan",21,95.5f };char buf[30] = { 0 };sprintf(buf, "%s %d %f", s.name, s.age, s.score);printf("%s\n", buf);return 0;
}

5.10.2 fscanf函數

int sscanf(const char* str, const char* format, ...);

功能:從字符串中讀取格式化數據。它與scanf類似,但輸入源是內存中的字符串而非控制臺或文件。常用于解析字符串中的格式化數據(如提取數字、分割文本等)。

參數:

(1)str:要解析的源字符串(輸入數據來源)。

(2)format:格式化字符串,定義如何解析數據(需與格式字符串中的說明符匹配)。

返回值:

成功時:返回成功解析并賦值的參數數量(非負值)。

失敗或未匹配任務數據:若輸入結束或解析失敗,返回EOF(通常是-1)。

代碼演示:

#include<stdio.h>struct S
{char name[30];int age;float score;
};int main()
{struct S s = { "zhangsan",21,95.5f };char buf[30] = { 0 };sprintf(buf, "%s %d %f", s.name, s.age, s.score);printf("%s\n", buf);struct S t = { 0 };sscanf(buf, "%s %d %f", t.name, &(t.age), &(t.score));printf("%s %f %d\n", t.name, t.score, t.age);return 0;
}

對比得出:

scanf:針對 標準輸入(stdin)的格式化輸入函數。

printf:針對標準輸出(stdout)的格式化輸出函數。

fscanf:針對所有輸入流(可以是文件流,也可以是stdin)的格式化輸入函數。

fprintf:針對所有輸出流(可以是文件流,也可以是stdout)的格式化輸出函數。

sprintf:將格式化的數據轉換成字符串。

sscanf:從字符串中提取格式化數據。

6.文件的隨機讀寫

6.1 fseek函數

根據文件指針的位置和偏移量來定位文件指針(文件內容的光標)。

int fseek(FILE* stream, long int offset, int origin);

origin:

SEEK_SET:文件開始位置。

SEEK_CUR:文件指示器當前的位置。

SEEK_END:文件末尾。

代碼示例:

讀文件:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}int ch = fgetc(pf);printf("%c\n", ch);//fseek(pf, 6, SEEK_SET);//ch = fgetc(pf);//printf("%c\n", ch);//g//fseek(pf, 5, SEEK_CUR);//ch = fgetc(pf);//printf("%c\n", ch);//gfseek(pf, -3, SEEK_END);ch = fgetc(pf);printf("%c\n", ch);//gfclose(pf);pf = NULL;return 0;
}

寫文件:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}fputs("abcdefghi", pf);fseek(pf, -3, SEEK_END);fputc('x', pf);fclose(pf);pf = NULL;return 0;
}

6.2 ftell函數

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

long int ftell(FILE* stream);

代碼示例:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}fputs("abcdefghi", pf);fseek(pf, -3, SEEK_END);fputc('x', pf);int ret = ftell(pf);printf("%d\n", ret);fclose(pf);pf = NULL;return 0;
}

6.3 rewind函數

讓文件指針的位置回到文件的起始位置

void rewind(FILE* stream);

7.文件緩沖區

ANSI C標準采用“緩沖文件系統”處理數據文件的,所謂緩沖文件系統是指系統自動地在內存中為程序中每一個正在使用的文件開辟一塊“文件緩沖區”。從內存向磁盤輸出數據會先送到內存中的緩沖區,裝滿緩沖區后才一起送到磁盤上。緩沖區的大小根據C編譯系統決定的。

緩沖區包含:完全緩沖、行緩沖、無緩沖。

7.1 fflush函數

int fflush(FILE* stream);

功能:強制刷新參數stream指定流的緩沖區,確保數據寫入底層設備。

對輸出流:將緩沖區中未寫入的數據立即寫入文件。

對輸入流:行為由具體實現決定,非C語言標準行為(可能清空緩沖區)。

參數為NULL時:刷新所有打開的輸出流。

參數:

stream:指向文件流的指針(如stdout、文件指針等)。

返回值:成功返回0,失敗返回EOF。

注意事項:

(1)僅對輸出流或更新流(最后一次操作作為輸出)有明確刷新行為。

(2)輸入流的刷新行為不可移植(如清空輸入緩沖區時非標準特性)。

(3)程序正常終止(exit)或調用fclose時會自動刷新,但程序崩潰時緩沖區數據可能丟失。

代碼演示:

#include<stdio.h>
#include<windows.h>
int main()
{FILE* pf = fopen("data.txt", "w");fputs("abcdef", pf);//先將代碼放到輸入緩沖區printf("睡眠10秒-已經寫數據了,打開data.txt文件,發現文件沒有內容\n");Sleep(10000);printf("刷新緩沖區\n");fflush(pf);//刷新緩沖區時,才將輸出緩沖區的數據寫到文件printf("再睡眠10秒-此時,再次打開data.txt文件,文件有內容了\n");Sleep(10000);fclose(pf);pf = NULL;return 0;
}

得出結論:

因為有緩沖區的存在,C語言在操作文件的時候,需要做刷新緩沖區或者在文件操作結束的時候關閉文件。

如果不做,可能導致讀寫文件的問題。

8.更新文件

在文件的打開模式中有三種方式值得注意,分別是:“r+”,“w+”,“a+”,分別是什么意思?

關鍵要點:

(1)在寫完文件后,要繼續讀文件的時候,在讀取之前一定要使用fflush()刷新文件緩沖區,或者使用fseek(),rewind()重新定位文件指示器的位置。

(2)在讀完文件后,需要繼續讀寫文件之前,在寫文件之前,使用fseek(),rewind()重新定位文件指示器的位置。

代碼演示:

#include<stdio.h>
int main()
{FILE* pf = fopen("test.txt", "w+");if (pf == NULL){perror("fopen");return 1;}fputs("abcdefghi", pf);fflush(pf);fseek(pf, 0, SEEK_SET);int ch = fgetc(pf);printf("%c\n", ch);fseek(pf, 2, SEEK_CUR);fputs("wyc", pf);fclose(pf);pf = NULL;return 0;
}

輸出結果:

上面就是文件操作的內容,各位碼友可以下去多試試函數來進行了解。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/99246.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/99246.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/99246.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

oracle認證有哪幾種?如何選擇

Oracle&#xff08;甲骨文&#xff09;不僅是全球領先的數據庫軟件巨頭&#xff0c;更是企業級數據管理的代名詞&#xff0c;獲得Oracle認證&#xff0c;證明可從事Oracle數據庫服務器的數據操作和管理等工作。下面給大家詳細其主要認證類型及其在職業發展中的含金量&#xff0…

AppTest邀請測試測試流程

相比AppGallery邀請測試&#xff0c;AppTest邀請測試具備以下全新能力&#xff1a;若您同時發布了多個測試版本&#xff0c;AppTest支持測試版本自動升級到最新的測試版本。您可以選擇將當前最新在架版本的應用介紹截圖展示給測試人員&#xff0c;視覺效果更好&#xff0c;提升…

硬件 - oring多電源切換

目錄 一、ORing電路 1.1 ORING 電路 1.2 ORING 電路關鍵部分 二、多電源切換 2.1 主要思路 2.2 適用場景 一、ORing電路 1.1 ORING 電路 中文常稱 “或環電路” 或 “并聯冗余電路”是一種電源并聯冗余拓撲結構 核心功能&#xff1a;將多路獨立電源的輸出 “并聯整合”&a…

Qt多語言翻譯實戰指南:常見陷阱與動態切換解決方案

問題背景 在Qt項目國際化過程中&#xff0c;開發者經常會遇到各種翻譯邏輯問題&#xff0c;特別是需要實現運行時語言動態切換功能時。一個典型場景是&#xff1a;程序默認英文顯示&#xff0c;加載中文翻譯文件后界面變為中文&#xff0c;但再次切換回英文時卻失敗。本文將深入…

機器人要增加力矩要有那些條件和增加什么

機器人要增加力矩要有那些條件和增加什么進行詳細講解 好的&#xff0c;這是一個非常專業且重要的問題。為機器人增加力矩&#xff08;通常指提升關節輸出扭矩&#xff09;不是一個簡單的部件替換&#xff0c;而是一個涉及動力鏈、結構、控制和散熱的系統性工程。 以下將詳細講…

spring集成aes加密、rsa加密

文章目錄spring集成對稱加密spring集成rsa加密spring集成對稱加密 encrypt:key: aaabbb # 只配置這個參數就實現了對稱加密salt: 333444 # 這個可以不配置spring集成rsa加密 例如apollo&#xff0c;如果沒有配置encrypt.key&#xff0c;那么apollo不配置應該也是可以的&#…

OpenSTL PredRNNv2 模型復現與自定義數據集訓練

OpenSTL PredRNNv2 模型復現與自定義數據集訓練 概述 本文將詳細介紹如何復現 OpenSTL 中的 PredRNNv2 模型&#xff0c;并使用自定義的 NPY 格式數據集進行訓練和預測。我們將從環境配置開始&#xff0c;逐步講解數據預處理、模型構建、訓練過程和預測實現&#xff0c;最終實現…

Linux內核IPv4隧道模式封裝機制剖析

概述 在Linux網絡棧中,XFRM(Transform)子系統負責實現IPsec等安全協議的功能。其中,xfrm4_mode_tunnel.c是實現IPv4隧道模式封裝的核心模塊,為IPv4數據包提供隧道模式的封裝和解封裝能力。本文將深入分析這一模塊的實現機制。 模塊架構與功能 該模塊通過注冊到XFRM框架…

OPC Client第10講:實現主界面;獲取初始界面傳來的所有配置信息config【C++讀寫Excel:xlnx;ODBC;緩沖區】

接前面代碼內容&#xff1a; OPC Client第6講&#xff08;wxwidgets&#xff09;&#xff1a;Logger.h日志記錄文件&#xff08;單例模式&#xff09;&#xff1b;登錄后的主界面_wx.logger-CSDN博客 OPC Client第8講&#xff1a;OPC UA&#xff1b;KEPServerEX創建OPC服務器…

快速入門HarmonyOS應用開發(一)

目錄 前言 一、準備工作 二、實戰開發 2.1、Navigation簡介 2.2、頁面路由開發 2.2.1、創建常量 2.2.2、創建字符串資源 2.2.3、創建float資源 2.2.4、創建color資源 2.2.5、創建數據實體 2.2.6、創建頁面路由表 2.2.7、創建Navigation根容器 2.2.8、創建NavDesti…

AI 進課堂 - 語文教學流程重塑

AI 進課堂 - 語文教學流程重塑執教語文十余年&#xff0c;備課案頭的參考書堆得比學生作業本還高&#xff0c;批改作文時紅筆芯換得比粉筆還勤。 直到去年把 JBoltAI 請進課堂&#xff0c;那些重復機械的工作突然有了新解法&#xff0c;連課堂上孩子們的眼神都亮了許多 —— 這…

用戶是否可以同時使用快照和備份來保護云服務器數據安全?

在云計算環境中&#xff0c;云服務器已成為企業和個人數據存儲、應用部署和業務運營的重要平臺。隨著業務數據量的不斷增長&#xff0c;數據安全和業務連續性成為用戶關注的核心問題。云服務器提供的快照和備份功能為用戶提供了有效的數據保護手段&#xff0c;但很多人會疑問&a…

RDS-MYSQL,這個RDS是什么?和mysql有什么區別?

好的&#xff0c;這是一個非常常見且重要的問題。我用最通俗易懂的方式給你解釋清楚。 一、大白話解釋 你可以把 MySQL 和 RDS MySQL 的關系&#xff0c;想象成&#xff1a;MySQL&#xff1a;就像是你自己買零件組裝的一臺電腦。 你需要自己挑選CPU、內存、硬盤、主板&#xff…

arcgis中實現四色/五色法制圖

四色定理是圖論中的一個著名定理&#xff0c;它指出在任何地圖上&#xff0c;只需四種顏色就足以使任何相鄰的區域&#xff08;擁有共同邊界線段&#xff0c;而非單個點&#xff09;顏色不同。五色定理則是另一個更早被證明的、較弱但更易證的定理。在地圖制圖中&#xff0c;這…

Spring如何巧妙解決循環依賴問題

什么是循環依賴&#xff1f;循環依賴是指兩個或多個Bean之間相互依賴&#xff0c;形成閉環的情況。例如&#xff1a;AService依賴BService&#xff0c;而BService又依賴AService。這種場景下&#xff0c;傳統的創建順序無法滿足依賴注入的要求。Spring的三級緩存機制Spring通過…

CUDA 中Thrust exclusive_scan使用詳解

1. 基本概念Thrust 是 NVIDIA CUDA 提供的類似 C STL 的并行算法庫。Scan (前綴和)&#xff1a;給定數組 [a0, a1, a2, ...]&#xff0c;產生前綴和序列。Exclusive Scan (排他前綴和)&#xff1a; 輸出位置 i 存放的是輸入數組中 0 到 i-1 的累積結果。換句話說&#xff0c;結…

Linux -- 信號【上】

目錄 一、信號的引入 1、信號概念 2、signal函數 普通標準信號詳解表 3、前臺/后臺進程 3.1 概念 3.2 查看后臺進程 3.3 后臺進程拉回前臺 3.4 終止后臺進程 3.5 暫停前臺進程 3.6 回復運行后臺進程 4、發信號的本質 二、信號的產生 1、終端按鍵 2、系統調用 2…

Altium Designer(AD)自定義PCB外觀顏色

目錄 1視圖設置界面介紹 2PCB阻焊層顏色設置 2.1進入視圖設置界面 2.2阻焊層顏色設置 2.3頂層和底層阻焊層顏色設置 2.4頂層阻焊層試圖效果 2.5底層阻焊層試圖效果 3設置PCB絲印顏色設置 3.1找到絲印設置選項 3.2設置頂層和底層絲印顏色 3.3頂層絲印 3.4底層絲印 4…

5天改造,節能50%!冷能改造如何實現“不停產節能”?

你有沒有發現一個現象&#xff1f;很多工廠老板一提到節能改造&#xff0c;第一反應就是搖頭。不是不想省電費&#xff0c;而是怕停產。停產一天損失幾十萬&#xff0c;改造周期動輒幾個月&#xff0c;這賬怎么算都不劃算。但如果我告訴你&#xff0c;有一種改造方式&#xff0…

【Flink】窗口

目錄窗口窗口的概念窗口的分類滾動窗口&#xff08;Tumbling Windows&#xff09;滑動窗口&#xff08;Sliding Windows&#xff09;會話窗口&#xff08;Session Windows&#xff09;全局窗口&#xff08;Global Windows&#xff09;窗口API概覽窗口函數增量聚合函數ReduceFun…