【C++ 语言】文件操作 ( fopen | fprintf | fscanf | fgets | fputc | fgetc | ofstream | ifstream )
文章目錄
- I C 函數 fopen 打開文件
- II C 函數 fprintf 寫出文件
- III C 函數 fscanf 讀取文件 ( 遇到空格換行結束)
- IV C 函數 fgets 讀取文件 ( 遇到換行結束)
- V C 函數 fputc 寫出單個字符
- VI C 函數 fgetc 讀取單個字符
- VII C++ IO 流
- VIII 文件操作代碼示例
I C 函數 fopen 打開文件
跨平臺開發時使用 C++ 對文件讀寫不經常使用 , 主要使用 C 語言對文件進行讀寫操作 ;
1. C 文件打開 :
- ① 頭文件 : stdio.h
- ② 原型 : FILE* fopen ( const char* path , const char* mode ) ;
2. 參數解析 :
- ① const char* path : 要打開的文件路徑 , 可以是相對路徑 , 也可以是絕對路徑 ;
- ② const char* mode : 打開文件的模式 ;
3. 文件打開模式只讀或只寫操作 :
- ① " r " : 打開已經存在的文本文件 , 只讀操作 ;
- ② " w " : 打開文本文件 , 只寫操作 , 從開始開始寫入內容 ;
- a. 文件不存在 : 創建新文件 , 從開頭寫入內容 ;
- b. 文件存在 : 刪除原有內容 , 從開頭寫入內容 ;
- ③ " a " : 打開文件文件 , 只寫操作 , 追加寫入內容 ;
- a. 文件不存在 : 創建新文件 , 從開頭寫入內容 ;
- b. 文件存在 : 在原有文件基礎上 , 追加寫入內容 ;
4. 文件打開模式讀寫操作 :
- ① " r+ " : 打開文本文件 , 讀寫操作 ;
- ② " w+ " : 打開文本文件 , 讀寫操作 ; 從開始開始寫入內容 ;
- a. 文件不存在 : 創建新文件 , 從開頭寫入內容 ;
- b. 文件存在 : 刪除原有內容 , 從開頭寫入內容 ;
- ③ " a+ " : 打開文本文件 , 讀寫操作 ; 追加寫入內容 ;
- a. 文件不存在 : 創建新文件 , 從開頭寫入內容 ;
- b. 文件存在 : 在原有文件基礎上 , 追加寫入內容 ;
II C 函數 fprintf 寫出文件
fprintf 函數簡介 :
- ① 頭文件 : stdio.h
- ② 函數原型 : int fprintf (FILE* stream, const char*format, [argument])
- ③ 參數 1 ( FILE * stream ) : FILE 指針 , 指向標識文件流的對象 ;
- ④ 參數 2 ( const char * format ) : C 字符串 , 要寫出的文本 , 包含占位符 ;
- ⑤ 參數 3 ( [argument] ) : 字符串中的占位符參數列表 ;
- ⑤ 函數作用 : 根據規定的數據格式 , 向輸出流中寫出數據 ;
代碼示例 :
//1. fprintf 寫出文本//創建一個只寫的文件 , 每次執行都重新寫入內容// 這里使用相對路徑 , 直接在代碼路徑下創建一個文件FILE* file_text_write = fopen("my_file.txt", "w");//文本形式寫出內容 : 使用格式化的方式輸出文本內容fprintf(file_text_write, "姓名:%s 學號:%d", "Tom", 1);//關閉文件 , 只有有 fopen , 就必須有對應的 fclose 與之對應fclose(file_text_write);III C 函數 fscanf 讀取文件 ( 遇到空格換行結束)
fscanf 函數簡介 :
- ① 頭文件 : stdio.h
- ② 函數原型 : int fscanf(FILE * stream, const char * format, [argument...]);
- ③ 參數 1 ( FILE * stream ) : FILE 指針 , 指向標識文件流的對象 ;
- ④ 參數 2 ( const char * format ) : C 字符串 , 聲明讀取的數據類型 ;
- ⑤ 函數作用 : 根據規定的數據格式 , 從輸入流中讀取數據 ;
fscanf 與 fgets 函數對比 :
- ① fscanf 遇到空格 , 換行 結束讀取 ;
- ② fgets 遇到空格時不結束讀取 , 遇到換行時結束 ;
代碼示例 :
//2. fscanf 讀取文本//以只讀形式打開FILE* file_text_read_fscanf = fopen("my_file.txt", "r");//讀取文件//定義讀取文件文本的緩沖區 , 最大可以讀取 1024 個字符char buffer[1024];//如果沒有遇到結尾 , 就一直讀取while (!feof(file_text_read_fscanf)){//參數1 : 文件指針 , 參數2 : 占位符 , 參數3 : 接收的緩沖區// 該方法遇到空格 , 會中斷讀取 , 因此這里要循環讀取數據fscanf(file_text_read_fscanf, "%s", buffer);cout << "fscanf 讀取到的文本內容 : " << buffer << endl;}//對應fopenfclose(file_text_read_fscanf);執行結果 : 遇到空格讀取就會中斷 , 這里循環了 2 次將文件讀取完畢 ;
fscanf 讀取到的文本內容 : 姓名:Tom fscanf 讀取到的文本內容 : 學號:1IV C 函數 fgets 讀取文件 ( 遇到換行結束)
1. fgets 函數簡介 :
- ① 頭文件 : stdio.h
- ② 函數原型 : char *fgets(char *str, int n, FILE *stream);
- ③ 參數 1 ( char *str ) : 字符指針 , 指向讀取文件字符串的緩沖區 ;
- ④ 參數 2 ( int n ) : 緩沖區中可讀取的最大字符數 ;
- ⑤ 參數 3 ( FILE *stream ) : FILE 指針 , 指向標識文件流的對象 ;
- ⑤ 函數作用 : 從輸入流中讀取一行文本數據 , 并將文本存儲到字符數組緩沖區中 ;
2. fscanf 與 fgets 函數對比 :
- ① fscanf 遇到空格 , 換行 結束讀取 ;
- ② fgets 遇到空格時不結束讀取 , 遇到換行時結束 ;
3. 代碼示例 :
//3. fgets 讀取指定大小的文本//以只讀形式打開FILE* file_text_read_fgets = fopen("my_file.txt", "r");//讀取文件//定義讀取文件文本的緩沖區 , 最大可以讀取 1024 個字符char buffer1[1024];//參數1 : 接收的緩沖區 , 參數2 : 讀取的字節數 , 參數3 : 文件指針// 該方法遇到空格 , 會繼續讀取 , 因此這里只需要讀取一次即可fgets(buffer1, 1024, file_text_read_fgets);cout << "fgets 讀取到的文本內容 : " << buffer1 << endl;//對應fopenfclose(file_text_read_fgets);4. 執行結果 :
fgets 讀取到的文本內容 : 姓名:Tom 學號:1V C 函數 fputc 寫出單個字符
1. fputc 函數簡介 :
- ① 頭文件 : stdio.h
- ② 函數原型 : int fputc (int c, File *fp)
- ③ 參數 1 ( int c ) : 要寫出的字符 ;
- ④ 參數 2 ( File *fp ) : 文件指針 ;
- ⑤ 函數作用 : 向文件中寫出一個單個字符 ;
- ⑥ 返回值 : 如果寫出成功 , 返回寫出字符的 ASCII 值 , 如果寫出失敗 , 返回 EOF 即 -1 ;
2. 代碼示例 :
//4. 寫出單個字符FILE* file_text_read_fputc = fopen("my_file.txt", "w");//寫出單個字符串fputc('A', file_text_read_fputc);//關閉文件fclose(file_text_read_fputc);VI C 函數 fgetc 讀取單個字符
1. fgetc 函數簡介 :
- ① 頭文件 : stdio.h
- ② 函數原型 : int fgetc(FILE *stream)
- ④ 參數 ( File *stream ) : 文件指針 ;
- ⑤ 函數作用 : 從文件流中讀取一個字符 ;
- ⑥ 返回值 : 從文件中讀取的字符 ASCII 碼值 ;
2. 代碼示例 :
//5. 讀取單個字符FILE* file_text_read_getc = fopen("my_file.txt", "r");//讀取單個字符串int fgetc_result = fgetc(file_text_read_getc);//將 int 類型變量轉為 char 類型變量char fgetc_result_char = fgetc_result;cout << "fgetc 讀取的單個字符 : " << fgetc_result_char << endl;//關閉文件fclose(file_text_read_getc);3. 執行結果 :
fgetc 讀取的單個字符 : AVII C++ IO 流
1. C++ 中主要使用以下三個數據類型進行 IO 流操作 ;
- ofstream : 文件輸出流 , 向文件寫出內容 ( 如果沒有文件會創建文件 ) ;
- ifstream : 文件輸入流 , 讀取文件內容 ;
- fstream : 文件輸入輸出流 , 兼顧上述兩種輸入輸出流的功能 ;
2. 創建輸出流 ofstream : 直接聲明 ofstream 對象即可 ;
//創建 io 輸出流ofstream io_out_file_stream;3. 打開文件輸出流 : 調用 ofstream 對象的 open() 方法 , 即可打開文件的輸出流 , 可以用于向文件中寫入數據 ;
//使用 io_out_file_stream 打開或創建文件io_out_file_stream.open("io_file.txt");4. 從命令行讀取數據 : 使用 cin >> io_buffer; 指令 , 可以阻塞命令行 , 等待用戶輸入文本信息 ; io_buffer 是一個 char 數組緩沖區 ;
//該操作會阻塞命令行 , 等待用戶輸入文本信息cin >> io_buffer;5. 向文件中寫出數據 : io_out_file_stream << io_buffer << endl; , 向 io_out_file_stream 輸出流中寫入數據 , 即將緩沖區中的內容寫出到了文件中 ;
// 向文件寫入用戶輸入的數據io_out_file_stream << io_buffer << endl;6. 創建輸入流 : 聲明 ifstream 類型對象 , 即創建了一個文件輸入流對象 ;
//打開輸入流ifstream io_in_file_stream;7. 打開文件輸入流 : 調用 ifstream 文件輸入流對象的 open 方法 , 即可獲取指定路徑文件的輸入流 ;
//打開文件io_in_file_stream.open("io_file.txt");8. 讀取文件中的內容 : 調用 io_in_file_stream >> io_buffer; , 可以將文件內容讀取到 io_buffer 緩沖區中 ;
//將文件內容讀取到緩沖區中io_in_file_stream >> io_buffer;9. 代碼示例 :
//7. C++ 流操作// ( 1 ) 寫出數據到文件//創建緩沖區char io_buffer[100];//創建 io 輸出流ofstream io_out_file_stream;//使用 io_out_file_stream 打開或創建文件io_out_file_stream.open("io_file.txt");//命令行中進行提示cout << "輸入你的名字: ";//該操作會阻塞命令行 , 等待用戶輸入文本信息cin >> io_buffer;// 向文件寫入用戶輸入的數據io_out_file_stream << io_buffer << endl;//關閉輸出流io_out_file_stream.close();// ( 2 ) 從文件讀取數據//打開輸入流ifstream io_in_file_stream;//打開文件io_in_file_stream.open("io_file.txt");cout << "讀取文件" << endl;//將文件內容讀取到緩沖區中io_in_file_stream >> io_buffer;//將緩沖區中內容打印到控制臺cout << "讀取的文件內容 : " << io_buffer << endl;// 關閉io_in_file_stream.close();10. 執行結果 :
輸入你的名字: 1 讀取文件 讀取的文件內容 : 1VIII 文件操作代碼示例
代碼調用示例 :
// XI . IO流//1. fprintf 寫出文本//創建一個只寫的文件 , 每次執行都重新寫入內容// 這里使用相對路徑 , 直接在代碼路徑下創建一個文件FILE* file_text_write = fopen("my_file.txt", "w");//文本形式寫出內容 : 使用格式化的方式輸出文本內容fprintf(file_text_write, "姓名:%s 學號:%d", "Tom", 1);//關閉文件 , 只有有 fopen , 就必須有對應的 fclose 與之對應fclose(file_text_write);//2. fscanf 讀取文本//以只讀形式打開FILE* file_text_read_fscanf = fopen("my_file.txt", "r");//讀取文件//定義讀取文件文本的緩沖區 , 最大可以讀取 1024 個字符char buffer[1024];//如果沒有遇到結尾 , 就一直讀取while (!feof(file_text_read_fscanf)){//參數1 : 文件指針 , 參數2 : 占位符 , 參數3 : 接收的緩沖區// 該方法遇到空格 , 會中斷讀取 , 因此這里要循環讀取數據fscanf(file_text_read_fscanf, "%s", buffer);cout << "fscanf 讀取到的文本內容 : " << buffer << endl;}//對應fopenfclose(file_text_read_fscanf);//3. fgets 讀取指定大小的文本//以只讀形式打開FILE* file_text_read_fgets = fopen("my_file.txt", "r");//讀取文件//定義讀取文件文本的緩沖區 , 最大可以讀取 1024 個字符char buffer1[1024];//參數1 : 接收的緩沖區 , 參數2 : 讀取的字節數 , 參數3 : 文件指針// 該方法遇到空格 , 會繼續讀取 , 因此這里只需要讀取一次即可fgets(buffer1, 1024, file_text_read_fgets);cout << "fgets 讀取到的文本內容 : " << buffer1 << endl;//對應fopenfclose(file_text_read_fgets);//4. 寫出單個字符FILE* file_text_read_fputc = fopen("my_file.txt", "w");//寫出單個字符串fputc('A', file_text_read_fputc);//關閉文件fclose(file_text_read_fputc);//5. 讀取單個字符FILE* file_text_read_getc = fopen("my_file.txt", "r");//讀取單個字符串int fgetc_result = fgetc(file_text_read_getc);//將 int 類型變量轉為 char 類型變量char fgetc_result_char = fgetc_result;cout << "fgetc 讀取的單個字符 : " << fgetc_result_char << endl;//關閉文件fclose(file_text_read_getc);//6. 讀寫二進制文件 使用 fwrite 與 fread 讀寫文件//7. C++ 流操作// ( 1 ) 寫出數據到文件//創建緩沖區char io_buffer[100];//創建 io 輸出流ofstream io_out_file_stream;//使用 io_out_file_stream 打開或創建文件io_out_file_stream.open("io_file.txt");//命令行中進行提示cout << "輸入你的名字: ";//該操作會阻塞命令行 , 等待用戶輸入文本信息cin >> io_buffer;// 向文件寫入用戶輸入的數據io_out_file_stream << io_buffer << endl;//關閉輸出流io_out_file_stream.close();// ( 2 ) 從文件讀取數據//打開輸入流ifstream io_in_file_stream;//打開文件io_in_file_stream.open("io_file.txt");cout << "讀取文件" << endl;//將文件內容讀取到緩沖區中io_in_file_stream >> io_buffer;//將緩沖區中內容打印到控制臺cout << "讀取的文件內容 : " << io_buffer << endl;// 關閉io_in_file_stream.close();執行結果 :
fscanf 讀取到的文本內容 : 姓名:Tom fscanf 讀取到的文本內容 : 學號:1 fgets 讀取到的文本內容 : 姓名:Tom 學號:1 fgetc 讀取的單個字符 : A 輸入你的名字: 1 讀取文件 讀取的文件內容 : 1總結
以上是生活随笔為你收集整理的【C++ 语言】文件操作 ( fopen | fprintf | fscanf | fgets | fputc | fgetc | ofstream | ifstream )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C++ 语言】异常 ( 抛出字符串异
- 下一篇: 【C++ 语言】Visual Studi