目錄
本文是在學校和教學視頻下總結的自己億點點心得,文章篇幅有一點長,如果讀者想要更深入的了解C語言文件操作,文件操作在C語言中比較獨立,沒那么重要,建議上手練一練,學編程不練習,不敲代碼進步會很慢,(保姆級教學)最后,如果你感覺本文寫的不錯,求收藏,求點贊,求評論,爆肝不易,你的三連是我學習最大的動力!!!
這就涉及到了數據持久化的問題,我們一般數據持久化的方法有,把數據存放在磁盤文件、存放到數據 庫等方式。 使用文件我們可以將數據直接存放在電腦的硬盤上,做到了數據的持久化。
指程序與數據的交互是以流的形式進行的。進行C語言文件的存取時,都會先進行“打開文件”操作,這個操作就是在打開數據流,而“關閉文件”操作就是關閉數據流。
指在程序執行時,所提供的額外內存,可用來暫時存放做準備執行的數據。它的設置是為了提高存取效率,因為內存的存取速度比磁盤驅動器快得多。
C語言的文件處理功能依據系統是否設置“緩沖區”分為兩種:一種是設置緩沖區,另一種是不設置緩沖區。由于不設置緩沖區的文件處理方式,必須使用較低級的I/O函數(包含在頭文件io.h和fcntl.h中)來直接對磁盤存取,這種方式的存取速度慢,并且由于不是C的標準函數,跨平臺操作時容易出問題。下面只介紹第一種處理方式,即設置緩沖區的文件處理方式:
當使用標準I/O函數(包含在頭文件stdio.h中)時,系統會自動設置緩沖區,并通過數據流來讀寫文件。當進行文件讀取時,不會直接對磁盤進行讀取,而是先打開數據流,將磁盤上的文件信息拷貝到緩沖區內,然后程序再從緩沖區中讀取所需數據,如下圖所示:
事實上,當寫入文件時,并不會馬上寫入磁盤中,而是先寫入緩沖區,只有在緩沖區已滿或“關閉文件”時,才會將數據寫入磁盤,如下圖所示。
分為文本文件和二進制文件兩種。
文本文件是以字符編碼的方式進行保存的。二進制文件將內存中數據原封不至文件中,適用于非字符為主的數據。如果以記事本打開,只會看到一堆亂碼。
其實,除了文本文件外,所有的數據都可以算是二進制文件。二進制文件的優點在于存取速度快,占用空間小,以及可隨機存取數據。
包括順序存取方式和隨機存取方式兩種。
順序讀取也就是從上往下,一筆一筆讀取文件的內容。保存數據時,將數據附加在文件的末尾。這種存取方式常用于文本文件,而被存取的文件則稱為順序文件。
隨機存取方式多半以二進制文件為主。它會以一個完整的單位來進行數據的讀取和寫入,通常以結構為單位。
磁盤上的文件是文件。 但是在程序設計中,我們一般談的文件有兩種:程序文件、數據文件(從文件功能的角度來分類的)。
包括源程序文件(后綴為.c),目標文件(windows環境后綴為.obj),可執行程序(windows環境 后綴為.exe)。
文件的內容不一定是程序,而是程序運行時讀寫的數據,比如程序運行需要從中讀取數據的文 件,或者輸出內容的文件。
其實有時候我們會把信息輸出到磁盤上,當需要的時候再從磁盤上把數據讀取到內存中使用,這里處理 的就是磁盤上文件。
一個文件要有一個唯一的文件標識,以便用戶識別和引用。
文件名包含3部分:文件路徑+文件名主干+文件后綴
例如: c:/code/test.txt
為了方便起見,文件標識常被稱為文件名。
緩沖文件系統中,關鍵的概念是“文件類型指針”,簡稱“文件指針”。
每個被使用的文件都在內存中開辟了一個相應的文件信息區,用來存放文件的相關信息(如文件的名 字,文件狀態及文件當前的位置等)。這些信息是保存在一個結構體變量中的。該結構體類型是有系統 聲明的,取名FILE.
例如,VS2013編譯環境提供的 stdio.h 頭文件中有以下的文件類型申明:
struct _iobuf { char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz; char *_tmpfname; };typedef struct _iobuf FILE;
不同的C編譯器的FILE類型包含的內容不完全相同,但是大同小異。
每當打開一個文件的時候,系統會根據文件的情況自動創建一個FILE結構的變量,并填充其中的信息, 使用者不必關心細節。
一般都是通過一個FILE的指針來維護這個FILE結構的變量,這樣使用起來更加方便。
下面我們可以創建一個FILE*的指針變量:
FILE* pf;//文件指針變量
定義pf是一個指向FILE類型數據的指針變量。可以使pf指向某個文件的文件信息區(是一個結構體變 量)。通過該文件信息區中的信息就能夠訪問該文件。也就是說,通過文件指針變量能夠找到與它關聯 的文件。
文件在讀寫之前應該先打開文件,在使用結束之后應該關閉文件。
在編寫程序的時候,在打開文件的同時,都會返回一個FILE*的指針變量指向該文件,也相當于建立了 指針和文件的關系。
ANSIC 規定使用fopen函數來打開文件,fclose來關閉文件。
//打開文件FILE * fopen ( const char * filename, const char * mode );//關閉文件int fclose ( FILE * stream );
文件使用方式 | ? ? ? ? ? ? ? ? ? ? ? 含義 | 如果指定文件不存在 |
---|---|---|
“r”(只讀) | 為了輸入數據,打開一個已經存在的文本文件 | 出錯 |
“w”(只寫) | 為了輸出數據,打開一個文本文件 | 建立一個新的文件 |
“a”(追加) | 向文本文件尾添加數據 | 出錯 |
“rb”(只讀) | 為了輸入數據,打開一個二進制文件 | 出錯 |
“wb”(只寫) | 為了輸出數據,打開一個二進制文件 | 建立一個新的文件 |
“ab”(追加) | 為了輸出數據,打開一個二進制文件 | 出錯 |
“r+”(讀寫) | 為了讀和寫,打開一個文本文件 | 出錯 |
“w+”(讀寫) | 為了讀和寫,建議一個新的文件 | 建立一個新的文件 |
“a+”(讀寫) | 打開一個文件,在文件尾進行讀寫 | 建立一個新的文件 |
“rb+”(讀寫) | 為了讀和寫打開一個二進制文件 | 出錯 |
“wb+”(讀寫) | 為了讀和寫,新建一個新的二進制文件 | 建立一個新的文件 |
“ab+”(讀寫) | 打開一個二進制文件,在文件尾進行讀和寫 | 建立一個新的文件 |
功能 | 函數名 | 適用于 |
---|---|---|
字符輸入函數 | fgetc | 所有輸入流 |
字符輸出函數 | fputc | 所有輸入流 |
文本行輸入函數 | gets | 所有輸入流 |
文本行輸出函數 | fputs | 所有輸入流 |
格式化輸入函數 | fscanf | 所有輸入流 |
格式化輸出函數 | fprintf | 所有輸入流 |
二進制輸入 | fread | 文件 |
二進制輸出 | fwrite | 文件 |
從流(fgetc、fgetwc)或stdin(fgetchar、fgetchar)中讀取字符。
?
將字符寫入流(fputc,fputwc)或標準輸出(_fputchar,_fputwchar)。
?
?從stdin流中獲取一行。
?將字符串寫入流。
從流中讀取格式化數據。
?
?將格式化數據打印到流。
從流中讀取數據。
?
將數據寫入流。?
?首先在桌面上創建一個321.txt文件,如上圖
int main(){ //打開文件 FILE* pf = fopen("C://Users//12556//Desktop//321.txt", "r"); if (pf == NULL) { perror("fopen"); return -1; } //讀文件 // //關閉文件 fclose(pf); pf = NULL; return 0;}
無錯誤,打開成功
int main(){ fputc("b", stdout);//putchar printf("%c", ch); fputc("i", stdout); fputc("t", stdout); return 0;}
int main(){ //打開文件 FILE* pf = fopen("C://Users//12556//Desktop//321.txt", "w"); if (pf == NULL) { perror("fopen"); return -1; } //寫文件 fputc("b", pf); fputc("i", pf); fputc("t", pf); //關閉文件 fclose(pf); pf = NULL; return 0;}
?寫入成功
int main(){ FILE* pf = fopen("C://Users//12556//Desktop//321.txt", "r"); if (NULL == pf) { perror("fopen"); return -1; } //讀文件 int ch = fgetc(pf); printf("%c/n", ch);//a ch = fgetc(pf); printf("%c/n", ch);//b ch = fgetc(pf); printf("%c/n", ch);//c //關閉文件 fclose(pf); pf = NULL; return 0;}
int main(){ int ch = fgetc(stdin);//getchar scanf("%c") printf("%c/n", ch);//a ch = fgetc(stdin); printf("%c/n", ch);//b ch = fgetc(stdin); printf("%c/n", ch);//c return 0;}
字符串輸入成功
int main(){ FILE* pf = fopen("data.txt", "w"); if (NULL == pf) { perror("fopen"); return -1; } //寫文件 //寫一行數據 fputs("hello world/n", pf); fputs("hello bit/n", pf); //關閉文件 fclose(pf); pf = NULL;}
在C語言文件下,我們找到data.txt文件,打開發現輸入成功
?
int main(){ FILE* pf = fopen("data.txt", "r"); if (NULL == pf) { perror("fopen"); return -1; } //讀文件 //讀一行數據 char arr[20] = { 0 }; fgets(arr, 20, pf); printf("%s/n", arr); fgets(arr, 20, pf); printf("%s/n", arr); //關閉文件 fclose(pf); pf = NULL;}
?
?文件閱讀成功
struct S{ int n; double d;};int main(){ struct S s = { 100, 3.14 }; FILE* pf = fopen("data.txt", "w"); if (NULL == pf) { perror("fopen"); return -1; } //寫文件 fprintf(pf, "%d %lf", s.n, s.d); //關閉文件 fclose(pf); pf = NULL;}
?
寫入成功
struct S{ int n; double d;};int main(){ struct S s = {0}; FILE* pf = fopen("data.txt", "r"); if (NULL == pf) { perror("fopen"); return -1; } //讀文件 fscanf(pf, "%d %lf", &(s.n), &(s.d)); printf("%d %lf/n", s.n, s.d); //關閉文件 fclose(pf); pf = NULL;}
?讀文件成功
struct S{ int n; double d; char name[10];};int main(){ struct S s = {100, 3.14, "zhangsan"}; FILE* pf = fopen("data.txt", "wb"); if (NULL == pf) { perror("fopen"); return -1; } //寫文件 - 二進制的方式寫 fwrite(&s, sizeof(s), 1, pf); //關閉文件 fclose(pf); pf = NULL;}
文件格式不同,但計算機是以二進制表示
//二進制的形式讀//struct S{ int n; double d; char name[10];};int main(){ struct S s = {0}; FILE* pf = fopen("data.txt", "rb"); if (NULL == pf) { perror("fopen"); return -1; } //讀文件 - 二進制的方式讀 fread(&s, sizeof(struct S), 1, pf); //打印 printf("%d %lf %s/n", s.n, s.d, s.name); //100 3.140000 zhangsan //關閉文件 fclose(pf); pf = NULL;}
?二進制閱讀成功
struct S{ int n; double d; char name[10];};int main(){ char arr[100] = { 0 }; struct S tmp = { 0 }; struct S s = { 100, 3.14, "zhangsan" }; //把一個格式化的數據轉換成字符串 sprintf(arr, "%d %lf %s", s.n, s.d, s.name); //打印 printf("%s/n", arr); //從arr中的字符串中提取出一個格式化的數據 sscanf(arr, "%d %lf %s", &(tmp.n), &(tmp.d), tmp.name); //打印 printf("%d %lf %s/n", tmp.n, tmp.d, tmp.name); return 0;}
?格式化字符串成功
在C語言文件下創建data.txt.
?添加abcdef
int fseek ( FILE * stream, long int offset, int origin );
根據文件指針的位置和偏移量來定位文件指針
int main(){ //打開文件 FILE *pf = fopen("data.txt", "r"); if (NULL == pf) { perror("fopen"); return -1; } //隨機讀寫 /*int ch = fgetc(pf); printf("%c/n", ch);*/ fseek(pf, 2, SEEK_SET); int ch = fgetc(pf); printf("%c/n", ch); fseek(pf, -2, SEEK_CUR); fclose(pf); pf = NULL; return 0;}
long int ftell ( FILE * stream );
返回文件指針相對于起始位置的偏移量
int main(){ //打開文件 FILE* pf = fopen("data.txt", "r"); if (NULL == pf) { perror("fopen"); return -1; } //隨機讀寫 /*int ch = fgetc(pf); printf("%c/n", ch);*/ fseek(pf, 2, SEEK_SET); int ch = fgetc(pf); printf("%c/n", ch); fseek(pf, -2, SEEK_CUR); ch = fgetc(pf); printf("%c/n", ch); int ret = ftell(pf); printf("%c/n", ret); fclose(pf); pf = NULL; return 0;}
?
void rewind ( FILE * stream );
讓文件指針的位置回到文件的起始位置
int main(){ //打開文件 FILE* pf = fopen("data.txt", "r"); if (NULL == pf) { perror("fopen"); return -1; } //隨機讀寫 /*int ch = fgetc(pf); printf("%c/n", ch);*/ fseek(pf, 2, SEEK_SET); int ch = fgetc(pf); printf("%c/n", ch); fseek(pf, -2, SEEK_CUR); ch = fgetc(pf); printf("%c/n", ch); int ret = ftell(pf); printf("%c/n", ret); rewind(pf); printf("%c/n", ret); fclose(pf); pf = NULL; return 0;}
根據數據的組織形式,數據文件被稱為文本文件或者二進制文件。 數據在內存中以二進制的形式存儲,如果不加轉換的輸出到外存,就是二進制文件。 如果要求在外存上以ASCII碼的形式存儲,則需要在存儲前轉換。以ASCII字符的形式存儲的文件就是文本文件。
一個數據在內存中是怎么存儲的呢? 字符一律以ASCII形式存儲,數值型數據既可以用ASCII形式存儲,也可以使用二進制形式存儲。 如有整數10000,如果以ASCII碼的形式輸出到磁盤,則磁盤中占用5個字節(每個字符一個字節),而 二進制形式輸出,則在磁盤上只占4個字節(VS2019測試)。
?在C語言文件下創建321.txt
#include int main(){ int a = 10000; FILE* pf = fopen("321.txt", "wb"); fwrite(&a, 4, 1, pf);//二進制的形式寫到文件中 fclose(pf); pf = NULL; return 0;}
打開321.txt,發現無法識別,以二進制表現
?我們在VS里面查找
?
?
?16進制表示
牢記:在文件讀取過程中,不能用feof函數的返回值直接用來判斷文件的是否結束。 而是應用于當文件讀取結束的時候,判斷是讀取失敗結束,還是遇到文件尾結束
1. 文本文件讀取是否結束,判斷返回值是否為 EOF ( fgetc ),或者 NULL ( fgets )
例如: fgetc 判斷是否為 EOF . fgets 判斷返回值是否為 NULL .
2. 二進制文件的讀取結束判斷,判斷返回值是否小于實際要讀的個數。
例如: fread判斷返回值是否小于實際要讀的個數。
#include #include int main(void){ int c; // 注意:int,非char,要求處理EOF FILE* fp = fopen("test.txt", "r"); if (!fp) { perror("File opening failed"); return EXIT_FAILURE; } //fgetc 當讀取失敗的時候或者遇到文件結束的時候,都會返回EOF while ((c = fgetc(fp)) != EOF) // 標準C I/O讀取文件循環 { putchar(c); } //判斷是什么原因結束的 if (ferror(fp)) puts("I/O error when reading"); else if (feof(fp)) puts("End of file reached successfully"); fclose(fp);}
以二進制文件為例
#include enum { SIZE = 5 };int main(void){ double a[SIZE] = { 1.,2.,3.,4.,5. }; FILE* fp = fopen("test.bin", "wb"); // 必須用二進制模式 fwrite(a, sizeof * a, SIZE, fp); // 寫 double 的數組 fclose(fp); double b[SIZE]; fp = fopen("test.bin", "rb"); size_t ret_code = fread(b, sizeof * b, SIZE, fp); // 讀 double 的數組 if (ret_code == SIZE) { puts("Array read successfully, contents: "); for (int n = 0; n < SIZE; ++n) printf("%f ", b[n]); putchar("/n"); } else { // error handling if (feof(fp)) printf("Error reading test.bin: unexpected end of file/n"); else if (ferror(fp)) { perror("Error reading test.bin"); } } fclose(fp);}
feof的用途:是文件讀取結束了,判斷是不是遇到文件末尾而結束的
ferror的用途:文件讀取結束了,判讀是不是遇到錯誤而結束
ANSIC 標準采用“緩沖文件系統”處理的數據文件的,所謂緩沖文件系統是指系統自動地在內存中為程序 中每一個正在使用的文件開辟一塊“文件緩沖區”。從內存向磁盤輸出數據會先送到內存中的緩沖區,裝 滿緩沖區后才一起送到磁盤上。如果從磁盤向計算機讀入數據,則從磁盤文件中讀取數據輸入到內存緩 沖區(充滿緩沖區),然后再從緩沖區逐個地將數據送到程序數據區(程序變量等)。緩沖區的大小根 據C編譯系統決定的。
#include #include //VS2013 WIN10環境測試int main(){ FILE* pf = fopen("test.txt", "w"); fputs("abcdef", pf);//先將代碼放在輸出緩沖區 printf("睡眠10秒-已經寫數據了,打開test.txt文件,發現文件沒有內容/n"); Sleep(10000); printf("刷新緩沖區/n"); fflush(pf);//刷新緩沖區時,才將輸出緩沖區的數據寫到文件(磁盤) //注:fflush 在高版本的VS上不能使用了 printf("再睡眠10秒-此時,再次打開test.txt文件,文件有內容了/n"); Sleep(10000); fclose(pf); //注:fclose在關閉文件的時候,也會刷新緩沖區 pf = NULL; return 0;}
這里可以得出一個結論: 因為有緩沖區的存在,C語言在操作文件的時候,需要做刷新緩沖區或者在文件操作結束的時候關閉文 件。 如果不做,可能導致讀寫文件的問題。
第1題:以下敘述中正確的是( )。
A、當對文件的讀(寫)操作完成之后,必須將它關閉,否則可能導致數據丟失
B、打開一個已存在的文件并進行了寫操作后,原有文件中的全部數據必定被覆蓋
C、在一個程序中當對文件進行了寫操作后,必須先關閉該文件然后再打開,才能讀到第1個數據
D、c語言中的文件是流式文件,因此只能順序存取數據
參考解析:【解析】B)選項中打開一個已存在的文件并進行了寫操作后,原有文件中的全部數據不一定被覆蓋,也可以對源文件進行追加操作等。C)選項中在一個程序中當對文件進行了寫操作后,不用先關閉該文件然后再打開,才能讀到第1個數據,可以用fseek()函數進行重新定位即可。D)選項中,c語言中的文件可以進行隨機讀寫。
第2題:下列關于c語言文件的敘述中正確的是
A、文件由一系列數據依次排列組成,只能構成二進制文件B、文件由結構序列組成,可以構成二進制文件或文本文件
C、文件由數據序列組成,可以構成二進制文件或文本文件
D、文件由字符序列組成,其類型只能是文本文件
參考解析:【解析】本題考查文件的概念,文件是由數據序列組成,可以構成二進制文件或文本文件,所以答案為C選項。
?
第3題:下面選項中關于"文件指針"概念的敘述正確的是
A、文件指針是程序中用FILE定義的指針變量B、文件指針就是文件位置指針,表示當前讀寫數據的位囂
C、文件指針指向文件在計算機中的存儲位置
D、把文件指針傳給fscanf函數,就可以向文本文件中寫入任意的字符
參考解析:【解析】在C語言中用一個指針變量指向一個文件,這個指針稱為文件指針。通過文件指針就可對它所指的文件進行各種操作。文件指針不是文件位置指針,所以BC選項錯誤,D選項中不可以寫入任意的字符。
?
第4題:以下選項中敘述正確的是
A、文件指針是指針類型的變量B、文件指針可同時指向不同文件
C、文件指針的值是文件在計算機磁盤中的路徑信息
D、調用fscanf涵數可以向文本文件中寫入任意字符
參考解析:【解析】所謂文件指針,實際上是指向一個結構體類型的指針變量,這個結構體中包含有文件的一些信息,如緩沖區的地址,在緩沖區中當前存取的字符的位置,對文件是“讀""還是“寫”,是否出錯,是否已經遇到文件結束標志等信息。文件指釬本身是指針類型的變量,A選項正確。一個指釬在同一時間只能指向一個文件,B選項錯誤。文件指針是指針變量,存儲的是文件緩存區音地址,而不是文件在計算機磁盤中的路徑信息,C選項錯誤。fscanf函數從文本文件中按格式讀入到程序中,而不是向文本文件中寫入數據,D選項錯誤。
第5題:以下敘述正確的是
A、文件指針是指針類型的變量B、文件指針變量的值是文件的當前讀取位器
C、文件指針變量的值是文件的當前讀取位置
D、調用fscanf函丞|數能向所有類型的文件中寫入任意字符
參考解析:【解析】文件指針指向的是文件緩沖區,而不是文件本身位置,因此BC選項錯誤;fscanfi)函數作用是從指定的文件中格式化讀數據,讀取數據類型由格式控制符決定,D選項錯誤,答案為A選項。
?
第6題:以下敘述正確的是
A、表達式sizeof(FILE*) == sizeof(int*)的值為真B、文件指針的值是一個整數,它的值一定小于文件字節數
C、文件指針的值是所指文件的當前讀取位置
D、使用fscanf函數可以向任意類型的文件中寫入任意數量的字符
參考解析∶【解析】sizeof(FILE*)=4,因為file*為指針,指針的大小4,sizeof(int*)=4理由同前面。文件指針的值是地址,是一個16進制的數,它的值不一定小于文件字節數,因此選項B錯誤。文件指針是所指文件的當前讀取位置,而不是文件指針的值因此選項C錯誤。intfscanf(FILE*stream.constchar*format, [argument.]):
fscanf函數可以向任意類型的文件,寫入任意數量不能超過系統的緩沖區,寫文件先寫入緩沖區,最后一起寫入文件,因此選項D錯誤。答案為A選項
?
第7題:以下關于c語言文件的敘述中正確的是
A、文件由數據序列組成,其類型可以為二進制文件或文本文件B、文件由記錄序列組成,其類型可以為二進制文件或文本文件
C、文件由字符序列組成,其類型可以為二進制文件或文本文件
D、文件由數據序列組成,其類型只能是二進制文件
參考解析︰【解析】C語言文件是指一組相關數據的有序集合,從文件編碼的方式看,文件可分為ASCII碼文件和二進制文件兩種,其中ASCII文件也稱為文本文件,所以文件由數據序列組成,類型可以為二進制文件或文本文件,選項A正確。
?
第1題:以下敘述中正確的是()。
A、文件指針是一種特殊的指針類型變量B、文件指針的值等于文件當前讀寫位置,以字節為單位
C、文件指針的值等于文件在計算機硬盤中的存儲位置
D、調用fscanf涵數只能向文本文件中寫入任意字符
參考解析:【解析】文件指針實際上是指向一個結構體類型的指針,這個結構體中包含有諸如:緩沖區的地址、在緩沖區中當前存取的字符的位置、對文件是“讀"還是“寫”、是否出錯、是否已經遇到文件結束標志等信息,選項A正確,選項B、c錯誤;fscanf)函數只能從文本文件中輸入數據到內存,選項D錯誤;本題答案為A。
?
第2題:下面說法正確的是()。
A、文件指針的值是文件的長度(以字節為單位)B、文件指針的值是文件名字符串存放的首地址
C、文件指針是指針類型的變量
D、fscanf函數可以向任意指定文件中寫入任意指定字符
參考解析:【解析】文件指針實際上是指向一個結構體類型的指針,這個結構體中包含有諸如:緩沖區的地址、在緩沖區中當前存取的字符的位置、對文件是“讀還是“寫"、是否出錯、是否已經遇到文件結束標志等信息,選項C正確,選項A、B錯誤;fscanf()函數只能從文本文件中輸入數據到內存,選項D錯誤;本題答案為C。
第3題:以下敘述中正確的是
A、C語言中的文件是流式文件,因此只能順序存取數據B、打開一個已存在的文件并進行了寫操作后,原有文件中的全部數據必定被覆蓋
C、在一個程序中,若對文件進行了寫操作,則必須先關i閉該文件然后再打開,才能讀到第1個數據
D、對文件的讀(寫)操作后,必須將它關閉,否則可能會導致數據丟失
參考解析:【解析】在C語言中,有兩種對文件的存取方式:順序存取和直接存取。如果以"a"”的方式對已打開的文件進行寫操作后,則原文件中內容將保存,新的數據寫在原有內容之后。如果以“a+”的方式為讀和寫操作而打開文件,則可以對文件進行讀/寫,而且在讀和寫操作之間不必關閉文件。可以從買開始讀。當對文件的讀(寫)操作完成之后,必須將它關閉。本題答案為D選項。
?
第4題:下面說法正確的是
A、文件指針指向文件當前正在處理的字節地址B、文件指針變量中保存的是所指文件包含的字符數
C、文件指針變量中的值是個常量,不能修改
D、文件指針變量的類型是FILE*
參考解析:【解析】在C語言中用一個指針變量指向一個文件,這個指針稱為文件指針。通過文件指針就可對它所指的文件進行各種操作。文件指針變量的類型是FILE*。本題答案為D選項。
第5題:下面說法正確的是
A、文件指針變量中保存的是文件在硬盤上的位置信息B、文件指針變量的類型是指針類型
C、文件指針變量指向文件名字符串的內存地址
D、文件指針指向文件當前正在處理的字節地址
參考解析:【解析】在C語言中用一個指針變量指向一個文件,這個指針稱為文件指針。通過文件指針就可對它所指的文件進行各種操作。這個指針是用來存放文件的首地址。這個指針是專門用來指向文件的。文件指針變量的類型是指針類型。本題答案為B選項。
第1題:設文件指針fp已定義,執行語句fp=fopen("file" "w");后,以下針對文本文件file操作敘述的選項中正確的是 第1題:設文件指針FP已定義,執行語句fp=fopen(文件“w”);后,以下針對文本文件文件操作敘述的選項中正確的是
A、只能寫不能讀 、只能寫不能讀B、寫操作結束后可以從頭開始讀
C、可以在原有內容后追加寫
D、可以隨意讀和寫
參考解析:【解析】考查文件操作函數fopen的基礎知識,以"w"方式打開文件,只能寫不能讀。?
第2題:以下關于fclose(fp)函數的敘述正確的是 第2題:以下關于flose(FP)函數的敘述正確的是
A、當程序中對文件的所有寫操作完成之后,必須調用fclose(fp)函數關閉文件B、當程序中對文件的所有寫操作完成之后,不一定要調用flose(FP)函數關閉文件
C 、只有對文件進行輸入操作之后,才需要調用flose(FP)函數關閉文件
D、只有對文件進行輸出操作之后,才能調用fclose(fp)函數關閉文件?
參考解析︰【解析】對一個文件操作完成后,要將該文件關閉,“關閉′就是使文件指針變量不再指向該文件。程序編寫者應該在程序終止之前關閉所有文件,如果不關閉,文件將會丟失數據。因為,在向文件寫數據時,是先將數據輸出到緩沖反,待緩沖區充滿后才正式輸出給文件。如果當數據未充滿緩沖區而程序結束運行,就會將緩沖區中的數據丟失。用fclose函數關閉文件,可以避免這個問題,它先把緩沖區中的數據輸出到磁盤文件,然后才釋放文件指針變量。所以對文件的所有寫操作完成之后必須要關閉文件,A選項正確,B選項錯誤。只要對文件進行操作后,都要調用fclose文件關閉文件,C、D進項錯誤。?
參考解析∶【解析】fopen函賽數以一定方式打開指定文件,返回一個指向文件的文件指針,如果不能實現打開指定文件的操作,則返回一個空指針NULL。如果指定文件不存在則創建一個文件名為指定文件名的新文件,然后打開它。在指定文件有錯誤或者指定文件不存在卻不能創建新文件的情況下,打開文件操作錯誤,返回空指針。本題程序中,文件test.txt不存在,但無其他異常,表示可以建立新文件,命名為test.txt,C洗項敘述正確,并以只寫方式打開它,D選項敘述正確,返回指向災件的指釬,if條件不成立,輸出“成功打開文件!”,B選項敘述正確,A選項敘述錯誤。所以選擇A選項。
?參考解析︰【解析】fopen函數以一定方式打開指定文件,返回一個指向文件的文件指針,如果不能實現打開指定文件的操作,則返回一個空指針NULL。如果指定文件不存在則創建一個文件名為指定文件名的新文件,然后打開它。在指定文件有錯誤或者指定文件不存在卻不能創建新文件的情況下,打開文件操作錯誤,返回空指針。本題程序中,文件test.txt不存在,但無其他異常,表示可以建立新文件,命名為test.txt,C選項敘述正確,并以只寫方式打開它,D選項敘述正確,返回指向文件的指釬,if條件不成立,輸出“成功打開文件!”,B選項敘述正確,A選項敘述錯誤。所以選擇A選項。
參考解析︰【解析】fopen函藥以一定方式打開指定文件,返回一個指向文件的文件指針,如果不能實現打開指定文件的操作,則返回一個空指針NULL。如果指定文件不存在則創建一個文件名為指定文件名的新文件,然后打開它。在指定文件有錯誤或者指定文件不存在卻不能創建新文件的情況下,打開文件操作錯誤,返回空指針。本題程序中,文件test.txt已存在,程序運行后,文件test.txt中的原有內容將全部消失,A選項正確。文件原本就存在,不會導致程序出錯,會按照指定的方式打開文件,B選項錯誤。對文件進行寫操作,只能對指針指向的位置內容進行寫操作,不能隨機讀寫,C選項錯誤。對文件test.txt寫入的內容寫到指針所指向的位署,而不是添加在文件尾部,D洗項錯誤。
第1題:讀取二進制文件的函數調用形式為:fread(buffer,size,count,fp);,其中buffer代表的是()。 第1題:讀取二進制文件的函數調用形式為:Fread(緩沖區、大小、計數、FP);其中緩沖區代表的是()。
A、一個內存塊的字節數 、一個內存塊的字節數B、一個整型變量,代表待讀取的數據的字節數?
C、一個文件指針,指向待讀取的文件?
D、一個內存塊的首地址,代表讀入數據存放的地址
參考解析:【解析】fread(void *buffer,size t size,size t count,FILE *stream);功能是從一個文件流中讀數據,讀取count個元素
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/121545.html
摘要:本文收錄于技術專家修煉文中配套資料合集路線導圖高清源文件點擊跳轉到文末點擊底部卡片回復資料領取哈嘍,大家好,我是一條最近粉絲問我有沒有自學路線,有了方向才能按圖索驥,事半功倍。 ...
文章目錄 強烈推薦系列教程,建議學起來!! 一.pycharm下載安裝二.python下載安裝三.pycharm上配置python四.配置鏡像源讓你下載嗖嗖的快4.1pycharm內部配置 4.2手動添加鏡像源4.3永久配置鏡像源 五.插件安裝(比如漢化?)5.1自動補碼神器第一款5.2漢化pycharm5.3其它插件 六.美女背景七.自定義腳本開頭八、這個前言一定要看九、pyt...
摘要:在對象的構造函數中,將一個函數作為第一個參數。二對象中的方法,可以接收構造函數中處理的狀態變化,并分別對應執行。 showImg(https://segmentfault.com/img/remote/1460000008932857); Promise的重要性我認為我沒有必要多講,概括起來說就是必須得掌握,而且還要掌握透徹。這篇文章的開頭,主要跟大家分析一下,為什么會有Promise...
閱讀 2648·2021-11-24 09:39
閱讀 1648·2021-11-24 09:38
閱讀 629·2021-11-22 14:44
閱讀 1888·2021-11-18 10:02
閱讀 2573·2021-11-18 10:02
閱讀 1158·2021-10-14 09:43
閱讀 4244·2021-09-29 09:35
閱讀 523·2021-07-30 15:30