用C語言了解文件那些下 ‘流‘ 事

  • 本篇會加入個人的所謂‘魚式瘋言’
  • ??????魚式瘋言:??????此瘋言非彼瘋言,而是理解過并總結出來通俗易懂的大白話,我會盡可能的在每個概念后插入魚式瘋言,幫助大家理解的,可能說的不是那么嚴謹.但小編初心是能讓更多人能接受我們這個概念
    在這里插入圖片描述

前言

💕💕💕艾迪巴帝,友子們,今天我們將推開 文件操作 的大門
主要講的有:

  1. ?件的引入?
  2. ?進制?件和?本?件?
  3. ?件的打開和關閉
  4. ?件的順序讀寫
    💖💖💖

一.文件的引入

1.為什么要使用文件?

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

2. 什么是文件

磁盤上的?件是?件。
但是在程序設計中,我們?般談的?件有兩種:程序?件、數據?件(從?件功能的?度來分類的)

2.1 程序文件

程序?件包括源程序?件(后綴為 .c
?標?件(windows環境后綴為 .obj
可執?程序(windows環境后綴為 .exe)。

2.2 數據?件

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

本章討論的是數據?件。

在以前各章所處理數據的輸?輸出都是以終端為對象的,即從終端的鍵盤輸?數據,運?結果顯?到 顯?器上。

其實有時候我們會把信息輸出到磁盤上,當需要的時候再從磁盤上把數據讀取到內存中使?,這?處理的就是磁盤上?件.

2.3 文件名

?個?件要有?個唯?的?件標識,以便??識別和引?。
?件名包含3部分:?件路徑+?件名主?+?件后綴
例如: c:\code\test.txt
為了?便起?,?件標識 常被稱為 ?件名

魚式瘋言
就是說呢😊😊😊
我們文件時在磁盤上的,用來存儲數據的,文件可以放程序也可以放數據,我們可以在終端(下面第一張的小黑框框),也可以在我們下面磁盤上處理(下面第二張文件路徑圖)
(1).
在這里插入圖片描述
(2).
在這里插入圖片描述

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

根據數據的組織形式,數據?件被稱為?本?件 或者?進制?件
數據在內存中以?進制的形式存儲,如果不加轉換的輸出到外存,就是?進制?件。

如果要求在外存上以ASCII碼的形式存儲,則需要在存儲前轉換。以ASCII字符的形式存儲的?件就是?本?件。
?個數據在內存中是怎么存儲的呢?
字符?律以ASCII形式存儲,數值型數據既可以?ASCII形式存儲,也可以使??進制形式存儲。
在這里插入圖片描述

如有整數10000,如果以ASCII碼的形式輸出到磁盤,則磁盤中占?5個字節(每個字符?個字節),??進制形式輸出,則在磁盤上只占4個字節

 #include <stdio.h>
int main()
{int a = 10000;FILE * pf = fopen("test.txt", "wb");fwrite(&a, 4, 1, pf);//?進制的形式寫到?件中 fclose(pf);pf = NULL;  return 0;
}

在這里插入圖片描述
文本文件是不打開的哦??????
那該怎么辦呢?
請寶子們看下面分解
在這里插入圖片描述

4.文件打開和關閉

4.1流和標準流

<1> 流

我們程序的數據需要輸出到各種外部設備
也需要從外部設備獲取數據
不同的外部設備的輸?輸出 操作各不相同
為了?便程序員對各種設備進??便的操作,我們抽象出了 的概念,我們可以把流 想象成流淌著字符的河。
C程序針對?件、畫?、鍵盤等的數據輸?輸出操作都是通過流操作的。
?般情況下,我們要想向流?寫數據,或者從流中讀取數據,都是要打開 ,然后操作。
在這里插入圖片描述

<2> 標準流

那為什么我們從鍵盤輸?數據,向屏幕上輸出數據,并沒有打開流呢? 那是因為C語?程序在啟動的時候,默認打開了3個流:

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

? stdout - 標準輸出流,?多數的環境中輸出?顯?器界?,printf函數就是將信息輸出到標準輸出 流中。

? stderr - 標準錯誤流,?多數環境中輸出到顯?器界?。

<3> 標準流的栗子🌰

#include<stdio.h>
int main()
{char arr[10]="abcdefg\n";fprintf(stdout,arr);//用 fprintf 標準輸出流輸出printf(arr);//普通的 printf 輸出
}

在這里插入圖片描述

魚式瘋言

其實,在我們的運行程序時

我們的編譯器就會在底層運行用到我們這三個標準流

輸入輸出錯誤

小伙伴了解一下即可,不需要深入研究

這是默認打開了這三個流,我們使?scanf、printf等函數就可以直接進?輸?輸出操作的。

stdin、stdout、stderr 三個流的類型是:
FILE* ,通常稱為?件指針。
C語?中,就是通過 FILE* 的?件指針來維護流的各種操作的。

魚式瘋言

啥是 呢?

說白了,就是一個中介,一個中轉站,一個快遞員,一個轉換器,一個中樞樞紐…

上面我們提及了一個陌生的概念,文件指針
這是什么呢?
不妨小伙伴都和我一起繼續往下找找答案吧😊😊😊

4.2 文件指針

緩沖?件系統中,關鍵的概念是“?件類型指針”,簡稱“?件指針”。 每個被使?的?件都在內存中開辟了?個相應的?件信息區,?來存放?件的相關信息(如?件的名 字,?件狀態及?件當前的位置等)。
這些信息是保存在?個結構體變量中的。該結構體類型是由系 統聲明的,取名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指向某個?件的?件信息區(是?個結構體變 量)。
通過該?件信息區中的信息就能夠訪問該?件。
在這里插入圖片描述

魚式瘋言

通過?件指針變量能夠間接找到與它關聯的?件.

在這里插入圖片描述

接下來,該我們實操起來啦💕💕💕

4.3 文件的打開和關閉

?件在讀寫之前應該先打開?件,在使?結束之后應該關閉?件。
在編寫程序的時候,在打開?件的同時,都會返回?個 FILE* 的指針變量指向該?件,也相當于建?了 指針和?件的關系。
ANSIC 規定使? fopen 函數來打開?件, fclose 來關閉?件。

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

在這里插入圖片描述

mode 表??件的打開模式,下?都是?件的打開模式:

在這里插入圖片描述
友子們是不是都不想看了,我也是😭😭😭
太多了吧,不過我們只需要會前面的 **“r”**和 **“w”**就足夠啦!

4.3.1 “w” 的栗子說明

在這里插入圖片描述

/* fopen fclose example */
#include <stdio.h>
int main()
{FILE* pFile;//打開?件pFile = fopen("myfile.txt", "w");//?件操作if (pFile != NULL){fputs("fopen example", pFile);//關閉?件fclose(pFile);}return 0;
}

在這里插入圖片描述
魚式瘋言:

有該文件我們可以用 “w” 自行打開,

如果沒有該文件的話,我們就可以通過 “w” 自動創建

具體對文件的流程就是

打開文件——>文件操作——>關閉文件.

4.3.2 “r” 的栗子說明

在這里插入圖片描述

就像上面這樣要是沒有該文件的情況,
如果我們用 “r” 來實踐呢!!!

/* fopen fclose example */
#include <stdio.h>
int main()
{FILE* pFile;//打開?件pFile = fopen("myfile.txt", "r");//?件操作if (pFile == NULL){perror("fopen");return 1;}//關閉?件fclose(pFile);return 0;
}

在這里插入圖片描述
小伙伴都看清楚區別了吧 “w” 和 “r”的區別吧😁😁😁

魚式瘋言

我是這樣理解的
w—> write 是寫的意思吧,如果我們要寫,當我們該文件名時,是不是可以先創個文件再寫呢 ! ! !
r——> read 是讀的意思呢,如果我們要讀,那如果也沒有該文件名呢,連個文件都沒有肯定會報錯呢! ! !
如果都有該文件名,這樣我們就可以用下面的順序讀寫函數對文件進行操作了。💖💖💖

5.文件的順序讀寫

5.1 順序讀寫函數介紹

在這里插入圖片描述
蛙趣,好多啊😣😣😣
沒關系,下面由小編來帶著大家一起學
咱們兩兩搭配起來用哦💖💖💖

5.2 fgetc 與 fputc

/*fputc與fgetc_test*/#include<stdio.h>
int main()
{FILE* putpile = fopen("gt.txt", "w");if (putpile == NULL){perror("fopen->putpile");return 1;} for (int i = 0; i < 26; i++){fputc('a' + i, putpile);}fclose(putpile);putpile = NULL;//這里一定要要指針置為空//否則就有可能出差錯FILE* getpile = fopen("gt.txt", "r");if (getpile == NULL){perror("fopen->getpile");return 1;}int ch = fgetc(getpile);printf("%c\n", ch);ch = fgetc(getpile);printf("%c\n", ch);ch = fgetc(getpile);printf("%c\n", ch);ch = fgetc(getpile);printf("%c\n", ch);//for (int i = 0; i < 4; i++)//{//	printf("%c\n", fgetc(getpile));//}//也可用循環打印fclose(getpile);getpile = NULL;//最后要關閉文件指針哦return 0;
}

在這里插入圖片描述
根據上面的代碼,我們就可以對文本進行 啦 !!!

5.3 fgets 與 fputs

在這里插入圖片描述

<1>.舉個栗子

#include<stdio.h>
int main()
{FILE* putpile = fopen("gt.txt", "w");if (putpile==NULL){perror("fopen");return 1;}fputs("abcde", putpile);fclose(putpile);putpile = NULL;FILE* getpile = fopen("gt.txt", "r");if (getpile==NULL){perror(fopen);return 1;}char arr[5];fgets(arr,4, getpile); printf(arr);fclose(getpile);getpile = NULL;return 0;
}

在這里插入圖片描述

魚式瘋言

唯一要注意一點是:

num : 這里是要指定輸出字符串大小的

5.3. fprintf 與 fscanf

在這里插入圖片描述

<1>.舉個栗子

struct Stu
{char name[20];int age;float score;
};
#include<stdio.h>
//fprintf與fscanf_test
int main()
{struct Stu s1 = { "hehehhhh" ,112, 12.366 };struct Stu s2 = {0};FILE* pc = fopen("gt.txt", "w");if (pc==NULL){perror("fopen");return 1;}fprintf(pc, "%s %d %.1f", s1.name, s1.age, s1.score);//fprintf 可以用于寫文件fclose(pc);pc = NULL;FILE* pf = fopen("gt.txt", "r");if (pf == NULL){perror("fopen");return 1;}//寫讀文件//fscanf(pf, "%s %d %f", s1.name, &(s1.age), &(s1.score));//寫出該文件的內容拷貝在結構體 s 上fprintf(stdout, "%s %d %.1f\n", s1.name, s1.age, s1.score);//讀取或輸出該結構體printf("%s %d %.1f\n", s1.name, s1.age, s1.score);fclose(pf);pf = NULL;return 0;
}

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

w方式時,我們用 fprintf 可以寫入
r方式時,我們可以通過 fscanf 從文本中傳出數據到結構體
再通過標準輸出流 stdout 打印我們的或者 printf 直接輸出

5.4. fwrite 和 fread

在這里插入圖片描述

<1>. fwrite 的栗子

  //fwrite
#include<stdio.h>
struct Stu
{char name[20];int age;float score;
};
int main()
{struct Stu s = {"zhangsan", 20, 90.5};FILE* pf = fopen("data.txt", "wb");if (pf == NULL){return 1;}//二進制的形式寫文件fwrite(&s, sizeof(s), 1, pf);fclose(pf);pf = NULL;return 0;
}

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

前面我們看到fprintf寫進去的文本,
下面小伙伴來看看這兩者的區別
在這里插入圖片描述

<2>. fread 的栗子

#include<stdio.h>
//fread_test
struct Stu
{char name[20];int age;float score;
};
int main()
{struct Stu s = { 0 };FILE* pf = fopen("data.txt", "rb");if (pf == NULL){return 1;}//二進制的形式讀文件fread(&s, sizeof(s), 1, pf);printf("%s %d %.1f\n", s.name, s.age, s.score);fclose(pf);pf = NULL;return 0;
}

在這里插入圖片描述
上面我們講到了二進制文件在文本文件中是會變亂的
但我們的讀取還是一樣的讀取

魚式瘋言

這點充分說明了,文件的種類雖然不同,形式發生了改變 ,但是文件的內容一般不會改變.

以上順序讀寫函數的操作,啥叫 順序讀寫 呢🤔🤔🤔
顯而易見 順序 順序 就是當相當于我們C語言程序自上而下的順序執行一樣,后期我們會進一步講解我們的文件隨機讀寫,文件讀取的判定和文件緩沖區的講解…

友友們敬請期待哦 !!!

總結
🤞🤞🤞在本篇文章中,我們主要講解有

  • ?件的引入的概念,類別!
  • ?進制?件和?本?件的認識
  • .文件指針的理解,以及利用函數對?件的打開和關閉
  • ?件的順序讀寫,不同文件操作函數的理解以及實際操作文本文件和二進制文件。

💖💖💖本次博文就到這里了,感覺各位小伙伴的賞臉品讀小編寫的拙作哦,

如果覺得小編寫的還不錯的咱可支持三關下,不妥當的咱評論區指正

希望我的文章能給各位家人們帶來哪怕一點點的收獲就是小編創作的最大動力💖💖💖

在這里插入圖片描述

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

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

相關文章

uniapp實戰 —— 自定義頂部導航欄

效果預覽 下圖中的紅框區域 范例代碼 src\pages.json 配置隱藏默認頂部導航欄 "navigationStyle": "custom", // 隱藏默認頂部導航src\pages\index\components\CustomNavbar.vue 封裝自定義頂部導航欄的組件&#xff08;要點在于&#xff1a;獲取屏幕邊界…

理解Go中的指針

引言 當你用Go編寫軟件時,你將編寫函數和方法。你可以將數據作為參數傳遞給這些函數。有時,函數需要數據的本地副本,而你希望原始數據保持不變。例如,如果你是一家銀行,你有一個函數向用戶顯示根據他們選擇的儲蓄計劃而產生的余額變化,你不希望在客戶選擇計劃之前更改他…

OpenAI在中國,申請GPT-6、GPT-7商標

根據最新商標信息顯示&#xff0c;OpenAI已經在中國提交了GPT-6和GPT-7的商標注冊信息&#xff0c;分類是科學儀器和網站服務兩大類。申請日期是今年的11月2日&#xff0c;目前處于審核狀態。 該申請由知識產權代理公司完成&#xff0c;但申請人的地址正是OpenAI在美國公司的地…

Echarts圖表title使用富文本

rich中有配置的話&#xff08;如a&#xff09;使用該樣式&#xff0c;沒有配置樣式的話&#xff08;如b&#xff09;使用外層textstyle的樣式&#xff0c;textstyle沒有樣式的話使用默認樣式 const option1 {tooltip: {trigger: "item",},title: {text: ["{a|1…

Java代碼審計之SpEL表達式注入漏洞分析

文章目錄 前言SpEL表達式基礎基礎用法安全風險案例演示 CVE-2022-22963漏洞簡述環境搭建反彈shell CVE漏洞調試分析本地搭建調試分析補丁分析 總結 前言 表達式注入是 Java 安全中一類常見的能夠注入命令并形成 RCE 的漏洞&#xff0c;而常見的表達式注入方式有 EL 表達式注入…

124.(leaflet篇)leaflet禁止地圖移動,縮放,雙擊

地圖之家總目錄(訂閱之前必須詳細了解該博客) 完整代碼工程包下載,運行如有問題,可“私信”博主。效果如下所示: 下面獻上完整代碼,代碼重要位置會做相應解釋 <!DOCTYPE html> <html>

深入探索HTTPS加密技術與新興安全趨勢:保衛隱私的未來之路

在前文中&#xff0c;我們了解了HTTPS加密協議的工作原理和應用場景。然而&#xff0c;隨著技術的不斷發展和網絡安全威脅的不斷演變&#xff0c;HTTPS加密技術也在不斷進化。在本篇博文中&#xff0c;我們將更深入地探討HTTPS加密技術&#xff0c;并介紹一些新興的安全趨勢&am…

css中的 box-sizing: border-box

box-sizing: border-box 是 CSS 中的一個盒子模型屬性&#xff0c;用于指定元素的盒子模型的計算方式。默認的盒子模型是 content-box&#xff0c;而使用 border-box 則表示元素的寬度和高度包括了元素的邊框和內邊距&#xff0c;而不僅僅是內容的寬度和高度。 在默認的 conte…

【Docker】使用docker-compose搭建django+vue工程文章

我們嘗試使用docker-compose編排一個后端基于django,前端基于vue,數據庫為postgresql并使用nginx進行反向代理的web工程。 工程準備 Docker 安裝Docker 安裝docker-compose django 在python3.7的環境下創建 修改settings.py文件 修改 將靜態文件收集路徑添加進 ,筆…

pip指定優先從豆瓣源下載包

對于 Unix/macOS 系統&#xff0c;使用以下命令&#xff1a; pip config set global.index-url https://pypi.douban.com/simple/ 對于 Windows 系統&#xff0c;打開命令提示符或PowerShell&#xff0c;并使用相同的命令&#xff1a; pip config set global.index-url http…

react re-render的解決方案

問題代碼 import {Dispatch, FC, SetStateAction, useState} from reactimport ./App.cssconst Child: FC<{ m: number, setM: Dispatch<SetStateAction<number>> }> (props) > {const {m, setM } propsreturn (<div><button onClick{() &…

阿里java社招一面

1、項目所負責的功能介紹&#xff1b;B用戶對A用戶的用餐評價進行評論以及B用戶對評論進行追評的話怎么設計數據庫結構&#xff1b;菜品好評度排行榜怎么實現的 2、clickhouse為什么快 3、線程池有哪幾種&#xff0c;分別說說定義和優缺點&#xff1b;多線程使用過程中要注意…

XUbuntu22.04之8款免費UML工具(一百九十七)

簡介&#xff1a; CSDN博客專家&#xff0c;專注Android/Linux系統&#xff0c;分享多mic語音方案、音視頻、編解碼等技術&#xff0c;與大家一起成長&#xff01; 優質專欄&#xff1a;Audio工程師進階系列【原創干貨持續更新中……】&#x1f680; 優質專欄&#xff1a;多媒…

前端知識筆記(四)———JQuery 自動刷新頁面但不閃爍的實現方法

在本文中&#xff0c;我們將介紹如何使用jQuery實現自動刷新頁面但不出現閃爍的效果。通常情況下&#xff0c;當我們需要自動刷新頁面時&#xff0c;使用簡單的location.reload()方法即可實現&#xff0c;但這會導致頁面在刷新時出現短暫的白屏或閃爍。為了解決這個問題&#x…

供應鏈管理痛點大解析!內附解決方案

供應鏈是指涉及產品或服務生產、運輸、分銷和最終交付給客戶的過程。 用一個汽車制造的例子來幫助大家理解&#xff1a; 原材料采購&#xff1a; 汽車制造商需要從供應商處采購制造汽車所需的原材料&#xff0c;例如金屬、橡膠、塑料和玻璃。生產制造&#xff1a;獲得原材料&…

UnoCSS 原子化開發初體驗

UnoCSS 是一個即時的原子化 CSS 引擎&#xff0c;旨在靈活和可擴展。核心是不拘一格的&#xff0c;所有的 CSS 工具類都是通過預設提供的。再也不用為了取一個 classname 類名而煩惱了。 一、UnoCSS 特點 完全可定制&#xff1a;無核心工具&#xff0c;所有功能都通過預設提供…

如何公網訪問內網的群暉NAS隨時隨地遠程訪問本地存儲的學習資源

文章目錄 前言本教程解決的問題是&#xff1a;按照本教程方法操作后&#xff0c;達到的效果是前排提醒&#xff1a; 1. 搭建群暉虛擬機1.1 下載黑群暉文件vmvare虛擬機安裝包1.2 安裝VMware虛擬機&#xff1a;1.3 解壓黑群暉虛擬機文件1.4 虛擬機初始化1.5 沒有搜索到黑群暉的解…

成都工業學院Web技術基礎(WEB)實驗六:ECMAScript基礎語法

寫在前面 1、基于2022級計算機大類實驗指導書 2、代碼僅提供參考&#xff0c;前端變化比較大&#xff0c;按照要求&#xff0c;只能做到像&#xff0c;不能做到一模一樣 3、圖片和文字僅為示例&#xff0c;需要自行替換 4、如果代碼不滿足你的要求&#xff0c;請尋求其他的…

TwinCAT3 Modbus-TCP Client/Server使用

目錄 一、環境配置和準備 1、PLC中安裝TF6250-Modbus-TCP庫 2、勾選TF6250的license 3、PLC工程中添加Tc2_ModbusSrv庫文件 4、分別創建測試ModbusTCP測試的Server和Client程序 二、PLC作為Client端 1、設置測試電腦IP地址 2、運行MobusTCP測試工具 3、PLC端程序編寫 …

Hiera實戰:使用Hiera實現圖像分類任務(二)

文章目錄 訓練部分導入項目使用的庫設置隨機因子設置全局參數圖像預處理與增強讀取數據設置Loss設置模型設置優化器和學習率調整策略設置混合精度&#xff0c;DP多卡&#xff0c;EMA定義訓練和驗證函數訓練函數驗證函數調用訓練和驗證方法 運行以及結果查看測試完整的代碼 在上…