C語言 文件操作

文章目錄

  • 前言
  • 文件概念
    • 文件名
    • 數據文件&程序文件
    • 文本文件&二進制文件
    • 文件緩沖區
  • 文件操作
    • FILE結構體
    • 文件指針
    • 文件打開&關閉
    • 文件輸入/輸出
    • 文件指針控制

前言

主要需要看的是概念部分、以及FILE結構體、文件指針部分。其余函數使用,知道其功能存在即可,實際在使用到這些函數時去官方文檔查的話,不管是介紹還是示例都更齊全。

文件概念

文件名

完整文件名包含三部分:文件路徑+文件名主干+文件后綴

c:\md\test.txt

文件名在同一臺主機中是唯一的。

數據文件&程序文件

根據用途劃分:

  1. 程序文件
    程序文件是包含計算機程序代碼的文件,它包含了一系列指令和命令,用于告訴計算機如何執行特定的任務。程序文件通常以可執行文件(如.exe、.app等)或源代碼文件(如.c、.py等)的形式存在。它們可以被計算機加載和執行,從而實現特定的功能或任務。

  2. 數據文件
    數據文件是存儲實際數據的文件,它包含了計算機程序需要處理的信息。數據文件可以是文本文件(如.txt、.csv等)或二進制文件(如.jpg、.mp3等),其中包含了具體的數據內容。數據文件可以包含文本、數字、圖像、音頻、視頻等各種類型的數據,這些數據可以被程序文件讀取和處理。

文本文件&二進制文件

根據數據儲存形式劃分

  1. 內存中文件是二進制文件
  2. 文本文件以ASCII字符形式存儲
  3. 二進制文件以二進制形式存儲

文件緩沖區

ANSIC 標準采用“緩沖文件系統”處理的數據文件的,所謂緩沖文件系統是指系統自動地在內存中為程序中每一個正在使用的文件開辟一塊“文件緩沖區”。從內存向磁盤輸出數據會先送到內存中的緩沖區,裝滿緩沖區后才一起送到磁盤上。如果從磁盤向計算機讀入數據,則從磁盤文件中讀取數據輸入到內存緩沖區(充滿緩沖區),然后再從緩沖區逐個地將數據送到程序數據區(程序變量等)。緩沖區的大小根據C編譯系統決定的。 文件緩沖區存在的意義是同過減少IO次數提高文件操作整體的效率。
在這里插入圖片描述

文件操作

FILE結構體

FILE 結構體的定義:

struct _iobuf {char *_ptr; // 文件指針int   _cnt;char *_base;int   _flag;int   _file;int   _charbuf;int   _bufsiz;char *_tmpfname;};
typedef struct _iobuf FILE

當使用者打開一個文件的時候,OS就會自動創建該文件的FILE類型變量,通過FILE的定義,可以理解該FILE類型記錄了該文件的信息,故用戶可以使用FILE類型變量的指針對FILE變量進行操作,從而達到對打開的文件進行操作的目的。例:

FILE* fp =  fopen ( const char * filename, const char * mode ); // 后續用fp指針操作即可

文件指針

文件指針是FILE結構體中的一個屬性
文件指針在讀取一個字符后會向后移動一位,說明文件指針是可以指向文件信息區的各個部分的,可受使用者通過函數調整位置從而進行不同讀取/寫入策略的。(和數組的指針相比邏輯差不多,操作方法不一樣)

在這里插入圖片描述

文件打開&關閉

文件打開后必須關閉,否則會造成系統資源浪費。

//打開文件函數
FILE * fopen ( const char * filename, const char * mode );
//關閉文件函數
int fclose ( FILE * stream )

FILE * fopen ( const char * filename, const char * mode ) mode參數 模式 :

“r”  (只讀) 為了輸入數據,打開一個已經存在的文本文件
“w”  (只寫) 為了輸出數據,打開一個文本文件 建立一個新的文件
“a”  (追加) 向文本文件尾添加數據 建立一個新的文件
“rb” (只讀) 為了輸入數據,打開一個二進制文件 出錯
“wb” (只寫) 為了輸出數據,打開一個二進制文件 建立一個新的文件
“ab” (追加) 向一個二進制文件尾添加數據 出錯
“r+” (讀寫) 為了讀和寫,打開一個文本文件 出錯
“w+” (讀寫) 為了讀和寫,建議一個新的文件 建立一個新的文件
“a+” (讀寫) 打開一個文件,在文件尾進行讀寫 建立一個新的文件
“rb+”(讀寫) 為了讀和寫打開一個二進制文件 出錯
“wb+”(讀寫) 為了讀和寫,新建一個新的二進制文件 建立一個新的文件
“ab+”(讀寫) 打開一個二進制文件,在文件尾進行讀和寫 建立一個新的文件

文件輸入/輸出

字符輸入函數    fgetc   所有輸入流
字符輸出函數    fputc   所有輸出流
文本行輸入函數  fgets   所有輸入流
文本行輸出函數  fputs   所有輸出流
格式化輸入函數  fscanf  所有輸入流
格式化輸出函數  fprintf 所有輸出流
二進制輸入      fread   文件
二進制輸出      fwrite  文件`

例:

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "r");  // 打開文件if (file == NULL) {printf("無法打開文件\n");return 1;}int ch;while ((ch = fgetc(file)) != EOF) {  // 逐個字符讀取文件內容printf("%c", ch);}fclose(file);  // 關閉文件return 0;
}

文件指針控制

(文件隨機讀寫)

fseek

功能:根據文件指針的位置和偏移量來定位文件指針。
函數原型為:

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

參數說明:
stream:指定要設置位置的文件指針。
offset:設置的偏移量,即要移動的字節數。
origin:設置基準位置,可以取以下值:
SEEK_SET:從文件開頭開始計算偏移量。
SEEK_CUR:從當前位置開始計算偏移量。
SEEK_END:從文件末尾開始計算偏移量。
返回值:
如果成功設置文件指針的位置,則返回0;
如果發生錯誤,則返回非零值。
使用示例:

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "r");  // 打開文件if (file == NULL) {printf("無法打開文件\n");return 1;}fseek(file, 5, SEEK_SET);  // 設置文件指針位置為從文件開頭偏移5個字節int ch;while ((ch = fgetc(file)) != EOF) {  // 從當前位置開始讀取文件內容printf("%c", ch);}fclose(file);  // 關閉文件return 0;
}

ftell
**功能:**返回文件指針相對于起始位置的偏移量

long int ftell(FILE *stream);

參數說明:
stream:指定要獲取位置的文件指針。
返回值:
如果成功獲取文件指針的當前位置,則返回當前位置相對于文件開頭的偏移量(以字節為單位);
如果發生錯誤,則返回-1。

rewind
功能:
讓文件指針的位置回到文件的起始位置
函數原型為

void rewind(FILE *stream);

參數說明
stream:指定要重新設置位置的文件指針。
返回值:無。

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

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

相關文章

【SpringBoot】請求參數

1. BS 架構 BS架構&#xff1a;Browser/Server&#xff0c;瀏覽器/服務器架構模式。客戶端只需要瀏覽器&#xff0c;應用程序的邏輯和數據都存儲在服務端。 在SpringBoot進行web程序開發時&#xff0c;它內置了一個核心的Servlet程序 DispatcherServlet&#xff0c;稱之為 核…

EasyExcel之文件導出最佳實踐

文件導出 官方文檔&#xff1a;寫Excel | Easy Excel (alibaba.com) 引言 當使用 EasyExcel 進行 Excel 文件導出時&#xff0c;我最近在工作中遇到了一個需求。因此&#xff0c;我決定寫這篇文章來分享我的經驗和解決方案。如果你對這個話題感興趣&#xff0c;那么我希望這篇…

c語言插入排序算法(詳解)

插入排序是一種簡單直觀的排序算法&#xff0c;其主要思想是將一個待排序的元素插入到已經排好序的部分的合適位置。 插入排序的原理如下&#xff1a; 將序列分為兩部分&#xff1a;已排序部分和未排序部分。初始時&#xff0c;已排序部分只包含第一個元素&#xff0c;未排序…

php 接入 百度編輯器

按照github上的操作下載百度編輯器的包后&#xff0c;根據文檔上的步驟操作&#xff08;可能會遇到報錯&#xff09;&#xff1a; 1、git clone 倉庫 2、npm install 安裝依賴&#xff08;如果沒有安裝 grunt , 請先在全局安裝 grunt&#xff09; 我的是報了下面的錯&#…

Leetcode 17 電話號碼的字母組合

理解題意&#xff1a; 給定一個僅包含數字 2-9 的字符串&#xff0c;返回所有它能表示的字母組合 本質上&#xff1a;數字代表著一個字母集合 數字的個數決定了遞歸的深度&#xff0c;即樹的深度 數字代表的字母組合決定了當前樹的寬度。 1.暴力回溯 這里沒有什么剪枝…

387.字符串中的第一個唯一字符 —> `size()`

解答&#xff1a; int firstUniqChar(string s) {int size s.size();// char count[26] { 0 };// error.1int count[26] { 0 };// for (int i 0; i < s.size() - 1; i) // error.2for (int i 0; i < size; i){count[s[i] - a] 1;}for (int i 0; i < size; i){…

Android 幸運轉盤實現邏輯

一、前言 幸運轉盤在很多app中都有&#xff0c;也有很多現實的例子&#xff0c;不過這個難度并不是如何讓轉盤轉起來&#xff0c;真正的難度是如何統一個方向轉動&#xff0c;且轉到指定的目標區域&#xff08;中獎概率從來不是隨機的&#xff09;&#xff0c;當然還不能太假&…

AI全棧大模型工程師(二十二)什么是模型訓練

文章目錄 ?? 這節課會帶給你還是寫在前面Fine-Tuning 有什么用:先看一個例子我有很多問題一、什么是:二、什么是模型2.1、通俗(不嚴謹)的說、模型是一個函數:2.2、一個最簡單的神經網絡三、什么是模型訓練3.1、模型訓練本質上是一個求解最優化問題的過程3.2、怎么求解3.…

人類的耳朵:聽覺的動態范圍

作者&#xff1a;聽覺健康 聽覺的動態范圍即可用的聽力范圍。在坐標系中&#xff0c;它可以表示為以聽閾和最大舒適級為界形成的區域&#xff0c;其坐標軸分別為頻率和聲壓級&#xff08;刺激持續時間在某種程度上對其產生影響&#xff09;。是什么因素決定了人類聽力的極限&am…

隨機森林回歸模型,SHAP庫可視化

隨機森林回歸模型 創建一個隨機森林回歸模型&#xff0c;訓練模型&#xff0c;然后使用SHAP庫解釋模型的預測結果&#xff0c;并將結果可視化。 具體步驟如下&#xff1a; 首先&#xff0c;代碼導入了所需的庫&#xff0c;包括matplotlib、shap、numpy和sklearn.ensemble。ma…

Compilation failureFailure executing javac, but could not parse the error

記一次maven編譯錯誤導致的打包失敗問題。錯誤如下 Compilation failure Failure executing javac, but could not parse the error: javac: Ч ? : ? ? : javac <options> <source files> -help г ? ? 排查路徑如下&#xff1a; 1&#xff…

[原創] FPGA的JTAG燒錄不穩定或燒錄失敗原因分析

一、電路故障背景 打板回來常會出現燒錄不良&#xff0c;調試是一個技術活&#xff0c;如果燒錄不過關&#xff0c;一切白搭。 二、常見JTAG故障原因如下&#xff1a; 1、ESD防護器件焊接不良&#xff1b; 電路板給生產部分焊接&#xff0c;發現元器件虛焊&#xff0c;特別是…

【MySQL】MySQL的varchar字段最大長度是65535?

在MySQL建表sql里,我們經常會有定義字符串類型的需求。 CREATE TABLE `user` ( `name` varchar(100) NOT NULL DEFAULT COMMENT 名字) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ; 比方說user表里的名字,就是個字符串。MySQL里有兩個類型比較適合這個場景。 char和varchar。…

我嘗試用 AI 來做數據分析,結果差強人意!

大家好&#xff0c;我是木川 工作中經常會需要分析數據 1、統計分析&#xff0c;計算某項指標的均值、分位數、標準差等 2、相關性分析&#xff0c;比如分析銷售額與顧客年齡、顧客性別、促銷活動等的相關性 3、可視化分析&#xff0c;比如繪制柱狀圖、折線圖、散點圖等 有了 A…

幾種排序的實現

直接插入排序 直接插入排序是一種簡單的插入排序法&#xff0c;其基本思想是&#xff1a; 把待排序的記錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中&#xff0c;直到所有的記錄插入完為止&#xff0c;得到一個新的有序序列 。 實際中我們玩撲克牌時&#xff…

交付《啤酒游戲經營決策沙盤》的項目

感謝首富客戶連續兩年的邀請&#xff0c;交付《啤酒游戲經營決策沙盤》的項目&#xff0c;下周一JSTO首席學習官Luna想讓我分享下系統思考與投資理財&#xff0c;想到曾經看過的一本書《深度思維》&#xff0c;看到一些結構來預判未來。不僅僅可以應用在企業經營和組織發展上&a…

Uncaught SyntaxError: Unexpected end of input (at manage.html:1:21) 的一個解

關于Uncaught SyntaxError: Unexpected end of input (at manage.html:1:21)的一個解 問題復現 <button onclick"deleteItem(${order.id},hire,"Orders")" >delete</button>報錯 原因 函數參數的雙引號和外面的雙引號混淆了&#xff0c;改成…

【vuex】

vuex 1 理解vuex1.1 vuex是什么1.2 什么時候使用vuex1.3 vuex工作原理圖1.4 搭建vuex環境1.5 求和案例1.5.1 vue方式1.5.2 vuex方式 2 vuex核心概念和API2.1 getters配置項2.2 四個map方法的使用2.2.1 mapState方法2.2.2 mapGetters方法2.2.3 mapActions方法2.2.4 mapMutations…

買賣股票的最佳時機算法(leetcode第121題)

題目描述&#xff1a; 給定一個數組 prices &#xff0c;它的第 i 個元素 prices[i] 表示一支給定股票第 i 天的價格。你只能選擇 某一天 買入這只股票&#xff0c;并選擇在 未來的某一個不同的日子 賣出該股票。設計一個算法來計算你所能獲取的最大利潤。返回你可以從這筆交易…

“HALCON error #2454:HALCON handle was already cleared in operator set_draw“

分析&#xff1a;錯誤提示是窗口句柄已經被刪除&#xff0c;這是因為前邊的一句 HOperatorSet.CloseWindow(hWindowControl1.HalconWindow); 關掉了窗口&#xff0c;屏蔽或刪除即可。