C語言學習筆記——文件

目錄

  • 1 文件的概念
  • 2 程序文件和數據文件
  • 3 二進制文件和文本文件
  • 4 流
    • 4.1 流的概念
    • 4.2 標準流
  • 5 文件信息區和文件指針
  • 6 處理文件的庫函數
    • 6.1 fopen
    • 6.2 fclose
    • 6.3 fgetc
    • 6.4 fputc
    • 6.5 fgets
    • 6.6 fputs
    • 6.7 fscanf
    • 6.8 fprintf
    • 6.9 fread
    • 6.10 fwrite
    • 6.11 fseek
    • 6.12 ftell
    • 6.13 rewind
    • 6.14 feof 和 ferror
  • 7 文件緩沖區

1 文件的概念

在磁盤中,用于保存數據的工具就是文件
比如,下圖的 test.txt 就是一個文件,保存了 1 2 3 4 5 6 7 8 9 10 這樣的數據
在這里插入圖片描述
在這里插入圖片描述

2 程序文件和數據文件

從程序設計的角度上來說,文件主要分為程序文件和數據文件
程序文件:用于保存程序代碼的文件,比如.c后綴的源文件,.h后綴的頭文件
數據文件:用于保存其它數據的文件,比如上文提到的 test.txt 文件

3 二進制文件和文本文件

在C語言編程中,對文件進行操作時,主要有二進制文件和文本文件兩個對象,它們都屬于數據文件
文本文件:數據在保存到文件時,會先將該數據按字節為單位轉換為字符,再以ASCII碼的形式保存
二進制文件:數據在保存到文件時,會直接以二進制序列的形式保存

舉例:1000在文本文件和二進制文件中的不同保存形式

在這里插入圖片描述

4 流

4.1 流的概念

由于計算機在運行時,會與各種各樣的外部設備交流,所以這會使得程序員需要掌握這些設備的輸入輸出方式,對程序員的要求大大提高,為避免這種現象的發生,提出了流的概念,流向程序員提供了一種便捷的輸入輸出方式,程序員只需要通過流,就可以直接與外部設備進行交互,不需要關心具體輸入輸出的細節

在這里插入圖片描述

4.2 標準流

標準流主要有3個,分別是 stdin,stdout,stderr
stdin:標準輸入流,用來從鍵盤上讀取數據,scanf 所使用的流就是它
stdout:標準輸出流,用來向屏幕輸出數據,printf 所使用的流就是它
stderr:標準錯誤流,用來在屏幕上顯示錯誤信息

C語言的程序啟動時,默認就開啟了這三個流

5 文件信息區和文件指針

打開文件時,會在內存中生成一個文件信息區,文件信息區本質是一個結構體(名為FILE),保存了文件的各種信息
用戶可以通過指向文件信息區的文件指針來訪問對應的文件,文件指針的類型為FILE*
在這里插入圖片描述

6 處理文件的庫函數

6.1 fopen

fopen 的函數聲明如下:

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

功能
打開一個文件

參數
filename 指要打開的文件的名稱
mode 指文件的打開方式

返回值
若文件打開成功,則會返回指向該文件文件信息區的文件指針
若文件打開失敗,則會返回空指針

文件的打開方式

功能文件不存在時
“r”指定本次打開要進行 讀文件 操作,對象為文本文件出錯
“w”指定本次打開要進行 寫文件 操作并清空文件數據,對象為文本文件創建新文件
“a”在文件末尾添加新內容,對象為文本文件創建新文件
“rb”指定本次打開要進行 讀文件 操作,對象為二進制文件出錯
“wb”指定本次打開要進行 讀文件 操作,對象為二進制文件創建新文件
“ab”在文件末尾添加新內容,對象為二進制文件創建新文件
“r+”指定本次打開要進行 讀文件和寫文件 操作,對象為文本文件出錯
“w+”指定本次打開要進行 讀文件和寫文件 操作,對象為文本文件創建新文件
“a+”在文件末尾添加新內容,對象為文本文件創建新文件
“rb+”指定本次打開要進行 讀文件和寫文件 操作,對象為二進制文件出錯
“wb+”指定本次打開要進行 讀文件和寫文件 操作,對象為二進制文件創建新文件
“ab+”在文件末尾添加新內容,對象為二進制文件創建新文件

舉例:以讀的形式,打開一個名為 “test.txt” 的文本文件

#include <stdio.h>
int main()
{FILE* pf = fopen("test.txt", "r"); //以讀的方式打開文件if (pf == NULL) //防止使用空指針assert(pf);fclose(pf); //關閉文件pf = NULL;return 0;
}

6.2 fclose

int fclose ( FILE * stream );

功能
用于關閉打開的文件

參數
stream 為指向要關閉文件的文件指針

6.3 fgetc

int fgetc ( FILE * stream );

功能
用來從文件中獲取一個字符

參數
stream 為指向要讀取文件的文件指針

返回值
若讀取成功,返回讀取到的字符
若讀取失敗或者遇到文件末尾,返回EOF

舉例:從文件中讀取一個字符并輸出

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL)assert(pf);printf("%c", (char)fgetc(pf));fclose(pf);pf = NULL;return 0;
}

6.4 fputc

int fputc ( int character, FILE * stream );

功能
用來向文件中寫入字符

參數
character 為要寫入的字符
stream 為指向要操作的文件的文件指針

返回值
若操作成功,則返回寫入的字符
若操作失敗,則返回EOF

舉例:寫一個字符到文件內

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL)assert(pf);fputc('a', pf);fclose(pf);pf = NULL;return 0;
}

6.5 fgets

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

功能
用來從文件中讀出 num-1 個字符,放入 str 指向的字符串內,最后自動補 ‘\0’

參數
str 為指向存放字符的字符串的指針
num 為要讀的字符數量,實際讀取數量為 num-1
stream 為指向要讀的文件的文件指針

返回值
若操作成功,則返回存放讀取字符的字符串首地址
若操作失敗,則返回空指針

舉例:讀取文件中的 4 個字符到字符串內

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL)assert(pf);char str[5] = " ";fgets(str, 5, pf);fclose(pf);pf = NULL;return 0;
}

6.6 fputs

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

功能
將字符串的內容寫到文件中

參數
str 為指向字符串的指針
stream 為指向要寫的文件的指針

返回值
操作成功時,返回非負值
操作失敗時,返回EOF

舉例:讀取一個字符串到文件內

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL)assert(pf);char str[20] = "hello world";fputs(str, pf);fclose(pf);pf = NULL;return 0;
}

6.7 fscanf

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

功能
根據給出的格式,從文件中讀取內容到后方的變量中

參數
stream 為指向要讀的文件的文件指針
format 為需要用戶指定的格式,比如%d,%s等
paramterList 為要存放數據的變量,可以有1個或多個

返回值
返回成功讀取的數據的量
如果在讀取的中途出錯或遇到文件尾,會設置 ferror 或 feof 指示器
如果一個數據都沒有讀取成功,返回EOF

舉例:讀取文件中的數據到變量中

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL)assert(pf);char str[20] = " ";fscanf(pf, "%s", str);fclose(pf);pf = NULL;return 0;
}

6.8 fprintf

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

功能
根據給出的格式,將對應變量中的值寫入文件中

參數
stream 為指向要寫的文件的指針
format 為需要用戶指定的格式,比如%d,%s等
paramterList 為要讀取的變量,可以有1個或多個

返回值
操作成功,則返回成功寫入的字符的數量
操作失敗,返回負數

舉例:寫入數據到文件中

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL)assert(pf);char str[20] = "hello world";printf("%d", fprintf(pf, "%s", str));fclose(pf);pf = NULL;return 0;
}

6.9 fread

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

功能
從文件中讀取 count 個 size 大小的數據到 ptr 指向的空間內,但是是以二進制的形式進行讀取

參數
ptr 為指向最終存放數據的空間的指針
size 是讀取的每個元素的大小,單位為字節
count 是讀取的元素個數
stream 是指向要讀取的文件的文件指針

返回值
返回成功讀取的元素的個數

舉例:從文件中讀取5個4字節的數據至數組中

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "rb");if (pf == NULL)assert(pf);int arr[5] = { 0 };fread(arr, sizeof(int), 5, pf);fclose(pf);pf = NULL;return 0;
}

6.10 fwrite

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

功能
從 ptr 指向的空間內讀取 count 個 size 大小的數據并以二進制的形式寫到文件內,

參數
ptr 為指向要讀取的空間的指針
size 每個元素的大小
count 為元素的個數
stream 為指向要寫入數據的文件的指針

返回值
返回成功寫入的元素的個數

舉例:向文件中寫入5個4字節的數據

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "wb");if (pf == NULL)assert(pf);int arr[5] = { 1,2,3,4,5 };fwrite(arr, sizeof(int), 5, pf);fclose(pf);pf = NULL;return 0;
}

6.11 fseek

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

功能
通過文件指針的位置,偏移量來移動文件指針

參數
stream 是指向文件的文件指針
offset 是偏移量,用來計算新的文件指針位置
origin 是文件指針的位置,有以下三個取值

取值含義
SEEK_SET文件的起始位置
SEEK_CUR當前文件指針的位置
SEEK_END文件的末尾

返回值
操作成功,返回0
操作失敗,返回非0

舉例:讀取下面這個文件的d字符
在這里插入圖片描述

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL)assert(pf);fseek(pf, 3, SEEK_CUR);printf("%c", fgetc(pf));fclose(pf);pf = NULL;return 0;
}

圖解:
在這里插入圖片描述
注意事項
若 origin 取值為 SEEK_END ,則偏移量需要給入負數,才能讀取前面的值

6.12 ftell

long int ftell ( FILE * stream );

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

參數
stream 為指向文件的文件指針

返回值
成功返回當前文件指針的位置
錯誤返回 -1L

舉例:計算下面文件的文件尾相對于起始位置的偏移量
在這里插入圖片描述

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL)assert(pf);while (fgetc(pf) != EOF); //使文件指針遍歷到結尾printf("%d", ftell(pf));fclose(pf);pf = NULL;return 0;
}

圖解:
在這里插入圖片描述

6.13 rewind

void rewind ( FILE * stream );

功能
將文件指針重置到文件的開始位置

參數
stream 為指向文件的文件指針

返回值

舉例:輸出兩次下列文件的內容
在這里插入圖片描述

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL)assert(pf);char ch = 0;while ((ch = fgetc(pf)) != EOF){printf("%c ", ch);}printf("\n", ch);rewind(pf); //重置文件指針的位置while ((ch = fgetc(pf)) != EOF){printf("%c ", ch);}fclose(pf);pf = NULL;return 0;
}

6.14 feof 和 ferror

int feof ( FILE * stream );

功能
判斷文件的讀取是否因為遇到了文件尾而結束

參數
stream 為指向文件的文件指針

返回值
是遇到了文件尾而結束,則返回非0
不是則返回0

int ferror ( FILE * stream );

功能
判斷文件的讀取是否因為遇到了錯誤而結束

參數
stream 為指向文件的文件指針

返回值
是遇到了錯誤而結束則返回非0
不是則返回0

我們可以通過使用 feof 和 ferror 來讓文件的讀取更加安全

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL)assert(pf);char ch = 0;while ((ch = fgetc(pf)) != EOF){printf("%c ", ch);}if (feof(pf)){printf("遇到文件尾結束");}else if (ferror(pf)){perror("fault");}fclose(pf);pf = NULL;return 0;
}

7 文件緩沖區

計算機在從文件內讀取數據或向文件內寫入數據時,會先將數據存入輸入/輸出緩沖區,待輸入/輸出緩沖區被填滿時,才會將數據讀入計算機或輸入到文件內,如果沒有緩沖區的話,那么就會出現輸入/輸出一次數據,操作系統就要介入進行處理的情況,操作系統不斷被打斷,無法服務于其它的進程,會使得操作系統的效率降低
在這里插入圖片描述

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

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

相關文章

C++語法與面向對象特性(2)

一.inline函數1.inline的基本特性被inline修飾的函數被稱為內聯函數。inline函數設計的初衷是為了優化宏的功能&#xff0c;編譯器會在編譯階段對inline函數進行展開。然而需要注意的是&#xff0c;inline對于編譯器而言是一種建議&#xff0c;它通常會展開一些簡短的&#xff…

Linux中grep命令

Linux 中的 grep 用法詳解grep 是 Linux 中強大的文本搜索工具&#xff0c;用于在文件或輸入流中查找匹配指定模式的行。其基本語法為&#xff1a;grep [選項] "模式" [文件]核心功能基礎搜索在文件中查找包含特定字符串的行&#xff1a;grep "error" log.…

【遙感圖像入門】遙感中的“景”是什么意思?

在遙感成像中,“3景城市影像”和“5景城市影像”中的“景”是遙感數據的基本單位,通常指一次成像過程中獲取的獨立遙感影像塊。這一概念的具體含義需結合技術背景和應用場景理解: 一、“景”的技術定義 單次成像的獨立覆蓋區域 遙感平臺(如衛星、飛機)在特定時間和位置對…

Pytorch-07 如何快速把已經有的視覺模型權重扒拉過來為己所用

下載&#xff0c;保存&#xff0c;加載&#xff0c;使用模型權重 在這一節里面我們會過一遍對模型權重的常用操作&#xff0c;比如&#xff1a; 如何下載常用模型的預訓練權重如何下載常用模型的無訓練權重&#xff08;只下載網絡結構&#xff09;如何加載模型權重如何保存權…

C語言零基礎第9講:指針基礎

目錄 1.內存和地址 2.指針變量和地址 2.1 取地址操作符&#xff08;&&#xff09; 2.2 指針變量 2.3 解引用操作符&#xff08;*&#xff09; 2.4 指針變量的大小 3.指針變量類型的意義 3.1 指針的解引用 3.2 指針 - 整數 3.3 void*指針 4.指針運算 4.1 指針…

013 HTTP篇

3.1 HTTP常見面試題 1、HTTP基本概念&#xff1a; 超文本傳輸協議&#xff1a;在計算機世界里專門在「兩點」之間「傳輸」文字、圖片、音頻、視頻等「超文本」數據的「約定和規范」HTTP常見的狀態碼 [[Pasted image 20250705140705.png]]HTTP常見字段 Host 字段&#xff1a;客戶…

每日面試題20:spring和spring boot的區別

我曾經寫過一道面試題&#xff0c;題目是為什么springboot項目可以直接打包給別人運行&#xff1f;其實這涉及到的就是springboot的特點。今天來簡單了解一下springboot和spring的區別&#xff0c; Spring 與 Spring Boot&#xff1a;從“全能框架”到“開箱即用”的進化之路 …

ClickHouse數據遷移

ClickHouse實例是阿里云上的云實例&#xff0c;想同步數據到本地&#xff0c;本地部署有ClickHouse實例&#xff0c;下面為單庫單表 源實例&#xff1a;阿里云cc-gs5xxxxxxx.public.clickhouse.ads.aliyuncs.com:8123 目標實例&#xff1a;本地172.16.22.10:8123 1、目標實例建…

sqli-labs-master/Less-41~Less-50

Less-41這一關還是用堆疊注入&#xff0c;這關數字型不需要閉合了。用堆疊的話&#xff0c;我們就不爆信息了。我們直接用堆疊&#xff0c;往進去寫一條數據?id-1 union select 1,2,3;insert into users (id,username,password) values(666,zk,180)--看一下插進去了沒?id-1 u…

Tiger任務管理系統-10

十是個很好美好的數字&#xff0c;十全十美&#xff0c;確實沒讓人失望&#xff0c;收獲還是很大的。 溫習了前端知識&#xff0c;鞏固了jQuery&#xff0c;thymeleaf等被忽視的框架&#xff0c;意外將之前的所學所用的知識都連起來了&#xff0c;感覺有點像打通了任督二脈一樣…

ora-01658 無法為表空間 users中的段創建initial區

ora-01658 無法為表空間 users中的段創建initial區 參考1 參考2 參考3 參考4 給用戶新增表空間 alter tablespace system add datafile D:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM03.DBF size 5G autoextend on next 10M;設置表空間文件自動擴展 ALTER DATABASE DATAFILE /…

lodash的替代品es-toolkit詳解

一、es-toolkit簡介 es-toolkit 是一款先進的高性能 JavaScript 實用程序庫,體積小巧,并支持強類型注釋,典型特征包括: 提供各種日常實用函數并采用現代實現,例如: debounce、delay、chunk、sum 和 pick 等 設計充分考慮了性能,在現代 JavaScript 環境中實現了 2-3 倍…

【原創】基于gemini-2.5-flash-preview-05-20多模態模型實現短視頻的自動化二創

畫面和解說保持一致&#xff0c;這個模型就是NB[16:57:37] [*] 正在從視頻中提取幀和時長 (頻率: 1.0 幀/秒)... [16:57:55] [] 提取完成。視頻時長: 83.40秒, 提取了 84 幀。 [16:57:55] [*] 使用AI供應商: gemini [16:57:55] [*] 正在進行視覺分析... [16:57:55] L-> 正…

數倉架構 數據表建模

數倉架構 主要用來描述 數據加工的實時鏈路 和 離線鏈路之間的關系,即 流批 關系; lamda 架構, 是兩條路, 實時計算式的, 維護數據的實時性。然后每天經過批計算后, 覆蓋實時的計算結果。 保證數據準確性。 kappa架構, 即流批一體了 數據建模 星型模型是數據倉庫中最…

vscode調試python腳本時無法進入函數內部的解決方法

只需在launch.json配置文件中添加“justMyCode”:false.

Python day37

浙大疏錦行 python day37. 內容&#xff1a; 保存模型只需要保存模型的參數即可&#xff0c;使用的時候直接構建模型再導入參數即可 # 保存模型參數 torch.save(model.state_dict(), "model_weights.pth")# 加載參數&#xff08;需先定義模型結構&#xff09; mod…

ORACLE進階操作

1 事務 事務的任務便是使數據庫從一種狀態變換成為另一種狀態&#xff0c;這不同于文件系統&#xff0c;它是數據庫所特用的。 所有的數據庫中&#xff0c;事務只針對DML&#xff08;增刪改)&#xff0c;不針對select select只能查看其他事務提交或回滾的數據&#xff0c;不能查…

Modbus 的一些理解

疑問&#xff1a;&#xff08;使用的是Modbustcp&#xff09;我在 Modbus slave 上面設置了slave地址為1&#xff0c;位置為40001的位置的值為1&#xff0c;40001這個位置上面的值是怎么存儲的&#xff0c;存儲在哪里的&#xff1f;他們是怎么進行交互的&#xff1f;在Modbus協…

【運動控制框架】WPF運動控制框架源碼,可用于激光切割機,雕刻機,分板機,點膠機,插件機等設備,開箱即用

WPF運動控制框架源碼&#xff0c;可用于激光切割機&#xff0c;雕刻機&#xff0c;分板機&#xff0c;點膠機&#xff0c;插件機等設備&#xff0c;考慮到各運動控制硬件不同&#xff0c;視覺應用功能&#xff08;應用視覺軟件&#xff09;也不同&#xff0c;所以只開發各路徑編…

RabbitMQ-日常運維命令

作者介紹&#xff1a;簡歷上沒有一個精通的運維工程師。請點擊上方的藍色《運維小路》關注我&#xff0c;下面的思維導圖也是預計更新的內容和當前進度(不定時更新)。中間件&#xff0c;我給它的定義就是為了實現某系業務功能依賴的軟件&#xff0c;包括如下部分:Web服務器代理…