C/C++文件操作————寫文件與讀文件以及通訊錄的改進 (保姆級教學)

個人主頁:點我進入主頁

專欄分類:C語言初階? ? ??C語言程序設計————KTV? ? ? ?C語言小游戲? ? ?C語言進階

C語言刷題

歡迎大家點贊,評論,收藏。

一起努力,一起奔赴大廠。

目錄

1.前言

2.寫文件函數與讀文件函數

2.1fputc函數

2.2fgetc函數

2.3fputs函數

2.4fgets函數

2.5fprintf函數

2.6fscanf函數

2.7sprintf函數與sscanf函數

2.8fwrite函數

2.9fread函數?

3.通訊錄的改進

4.文件的隨機讀寫

4.1fseek函數

4.2ftell函數

4.3rewind函數

?5.總結


1.前言

? ? ? ? ?在前面我們寫到過文件的打開與關閉用到了函數主要是fopen函數,參數是文件的文件名和打開方式,文件關閉函數fclose,參數是流,我們還講到過流,今天我們講解一些寫文件與讀文件函數以及對通訊錄的改進還有一些文件的其他函數。

2.寫文件函數與讀文件函數

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

2.1fputc函數

? ? ? ? 我們在cplusplus網中?fputc看到它的第一個參數是int? chararcter,這個含義是想要存儲的字符信息,第二個參數是流在這里指fopen函數的返回值,fputc函數是將chararcter存入文件中,我們寫一個代碼將abcdef放到文件中,詳細代碼如下:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}int i;for (i = 'a'; i <= 'f'; i++){fputc(i, pf);}fclose(pf);pf = NULL;return 0;
}

我們運行后打開文件data.txt

我們可以看到abcdef已經寫到了文件中?先打開文件,再利用循環利用寫入字符函數fputc進行信息的存儲。

2.2fgetc函數

? ? ? ? 我們進入cplusplus網站fgetc我們看到它的參數是流,返回值是int類型,hfgetc函數的作用是讀取文件的一個字符,我們寫一個代碼讀取fputc函數存在文件的信息,詳細代碼如下:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}int i,ch;for (i = 'a'; i <= 'f'; i++){ch = fgetc(pf);printf("%c", ch);}fclose(pf);pf = NULL;return 0;
}

我們運行結果如下:

2.3fputs函數

? ? ? ? ?我們進入cplusplus網站fputs,函數的第一個參數是const char *str是將str中的內容傳到文件中,第二個參數是流 ,返回類型是int,fputs函數的作用是將字符串傳到文件中,我們寫一個代碼將字符串abcdefgh傳到文件中,詳細代碼如下:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}char arr[] = "abcdefgh";fputs(arr,pf);fclose(pf);pf = NULL;return 0;
}

運行后我們打開data.txt文件 可以看到

我們如果再次將arr內容改為ccc運行后打開data.txt文件

我們還可以看到打開文件后光標都在最前面,而且原來的信息也沒有了,那我們是不是可以理解為寫入文件是將原來的文件的內容覆蓋,?然后寫入信息。

2.4fgets函數

? ? ? ? 我們進入cplusplus網站fgets看到它的第一個參數是char *str是讀取文件后存放在程序的變量,第二個參數int num是在文件中讀取幾個字符+1,第三個參數是流,返回值是char*,例如我們想讀取文件中的abcdefg,詳細代碼如下:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}char arr[1006] ;char* p = arr;p = fgets(p, 7, pf);printf("%s", arr);fclose(pf);pf = NULL;return 0;
}

我們運行后可以看到

?對于為什么是7,原因很簡單,fgets函數會在最后將數組的第num個位置轉化為’\0‘,我們進入調試可以看到

2.5fprintf函數

?

? ? ? ? 我們進入 cplusplus網站fprintf?查看fprintf函數的參數,看到這個函數你是不是會想到printf函數,我們同樣查看printf函數的參數

我們可以看到他們兩個只差流這個參數,fprintf函數是格式化輸入文件,我們寫一個代碼來展示一下這個函數的功能,代碼如下:

#include<stdio.h>
struct num {float s;int i;char s1[10];
}S;
int main(){FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}S = { 1.23f,10,"wo" };fprintf(pf, "%f-%d-%s", S.s, S.i, S.s1);fclose(pf);pf = NULL;return 0;
}

?我們運行程序后打開data.txt文件,可以看到

同樣我們可以理解為將結構體S里面的內容,以? -? -? 的形式輸出到文件里。

2.6fscanf函數

? ? ? ? ?我們進入cplusplus網站fscanf查看fscanf函數的參數,看到fscanf函數我們很容易想到scanf函數,我們同樣進入cplusplus網站查看scanf函數的參數,

我們可以看到這兩個函數的參數只差了一個流,?fscanf函數是將文件中有格式的信息儲存在程序中定義的變量里,我們利用fprintf函數儲存在文件的內容來初始化結構體S,詳細代碼如下:

#include<stdio.h>
struct num {float s;int i;char s1[10];
}S;
int main(){FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}fscanf(pf,"%f-%d-%s", &S.s, &S.i, &S.s1);printf("%f %d %s", S.s, S.i, S.s1);fclose(pf);pf = NULL;return 0;
}

我們運行代碼,可以看到

2.7sprintf函數與sscanf函數

? ? ? ? sprintf函數是將數據以字符的形式存在s中,?sscanf函數是將s的數據以字符的形式存在程序定義的變量中,我們寫一個程序,代碼如下:

#include<stdio.h>
struct num {int i;char arr;float f;
};
int main()
{struct num s = { 10,'c',1.2f};char arr[100] = { 0 };sprintf(arr, "%d%c%f", s.i, s.arr, s.f);struct num tmp = { 0 };sscanf(arr, "%d%c%f", &tmp.i, &tmp.arr, &tmp.f);printf("%d %c %f", tmp.i, tmp.arr, tmp.f);return 0;
}

運行結果如下:

2.8fwrite函數

? ? ? ? 我們進入cplusplus網站fwrite的參數第一個參數是const void *ptr是指向的數據的地址,第二個參數size_t size是單個數據所占據的字節,第三個參數size_t count是要寫進文件幾個數據,第四個參數是流,特別注意這是以二進制的形式儲存在文件中?,我么們寫一個代碼展示一下函數的功能,代碼如下:

#include<stdio.h>
struct num {int i;char arr[10];char brr[10];
};
int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}struct num s = { 1,"abcd","efg" };fwrite(&s, sizeof(struct num), 1, pf);fclose(pf);pf = NULL;return 0;
}

我們運行代碼后,打開data.txt文件可以看到:

由于是二進制的形式存儲,所以有些信息我們不能識別。

2.9fread函數?

? ? ? ? ?我們進入cplusplus網站看fread的參數一個參數是const void *ptr是要讀取文件信息保存到,第二個參數size_t size是單個數據所占據的字節,第三個參數size_t count是要寫進文件幾個數據,第四個參數是流,我們讀取上個函數的內容,代碼如下:

#include<stdio.h>
struct num {int i;char arr[10];char brr[10];
};
int main()
{FILE* pf = fopen("data.txt", "r ");if (pf == NULL){perror("fopen");return 1;}struct num s;fread(&s, sizeof(struct num), 1, pf);printf("%d\n%s\n%s", s.i, s.arr, s.brr);fclose(pf);pf = NULL;return 0;
}

運行程序后可以看到

3.通訊錄的改進

在程序中加入函數

void init(Struct* pc)
{assert(pc);FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return;}while (fread(pc->arr + pc->i , sizeof(struct xinxi), 1, pf)){		pc->i++;addnum(pc);}fclose(pf);pf = NULL;
}

以及函數

void save(Struct* pc)
{assert(pc);FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fclose");return;}int i;for (i = 0; i < pc->i; i++){fwrite(pc->arr + i, sizeof(struct xinxi), 1, pf);}fclose(pf);pf = NULL;
}

4.文件的隨機讀寫

4.1fseek函數

根據文件指針的位置和偏移量來定位文件指針,第一個參數是流,第二個參數是偏移量v,第三個參數是相對位置,SEEK_SET是對于最初的位置,SEEK_CUR是對現在的位置,SEEK_END是對最后一位的位置。

?我們寫一個代碼,如下:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r ");if (pf == NULL){perror("fopen");return 1;}int ch;ch = fgetc(pf);printf("%c", ch);//ach = fgetc(pf);printf("%c", ch);//bch = fgetc(pf);printf("%c", ch);//cfseek(pf, -3, SEEK_CUR);ch = fgetc(pf);printf("%c", ch);//afclose(pf);pf = NULL;return 0;
}

運行后為

這個函數有一定的局限性,我們必須對文件的內容非常熟悉,否則不容易輸出我們想要的值。

4.2ftell函數

這個函數是計算相對于初始位置的偏移量?,我們可以寫一個代碼,如下:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r ");if (pf == NULL){perror("fopen");return 1;}fseek(pf, 0, SEEK_END);size_t sz = ftell(pf);printf("%d", sz);fclose(pf);pf = NULL;return 0;
}

運行結果為

4.3rewind函數

函數的功能是讓指針指向初始位置,我們寫一個代碼,來展示一下它的功能:

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r ");if (pf == NULL){perror("fopen");return 1;}fseek(pf, -1, SEEK_END);int ch;ch = fgetc(pf);printf("%c\n", ch);rewind(pf);ch = fgetc(pf);printf("%c\n", ch);fclose(pf);pf = NULL;return 0;
}

運行結果為

文件的內容為

?5.總結

? ? ? ? 今天主要包括將數據傳入文件的函數,以及將文件中的內容傳到程序中的函數,還有一些對于文件中的指針以及偏移量的函數fseek函數,ftell函數,rewind函數的講解,異界對通訊錄的改造.今天的內容就結束了。

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

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

相關文章

多個JDK版本可以嗎:JDK17、JDK19、JDK1.8輕松切換(無坑版)小白也可以看懂

多個版本JDK切換 多個JDK&#xff1a;JDK17、JDK19、JDK1.8輕松切換&#xff08;無坑版&#xff09;小白也可以看懂 提示&#xff1a;看了網上很多教程&#xff0c;5w觀看、32w觀看、幾千觀看的&#xff0c;多多少少帶點坑&#xff0c;這里我就把踩過的坑都給抹了 文章目錄 多…

「Verilog學習筆記」不重疊序列檢測

專欄前言 本專欄的內容主要是記錄本人學習Verilog過程中的一些知識點&#xff0c;刷題網站用的是牛客網 題目要求檢測a的序列&#xff0c;a為單bit輸入&#xff0c;每個時刻可能具有不同的值&#xff0c; 當連續的六個輸入值符合目標序列表示序列匹配&#xff0c;當六個輸入值的…

免費接口集合讓開發更簡單

企業基本信息(含聯系方式)&#xff1a;通過公司名稱/公司ID/注冊號或社會統一信用代碼獲取企業基本信息和企業聯系方式&#xff0c;包括公司名稱或ID、類型、成立日期、電話、郵箱、網址等字段的詳細信息。企業基本信息&#xff1a;通過公司名稱/公司ID/注冊號或社會統一信用代…

Redisson分布式鎖源碼解析、集群環境存在的問題

一、使用Redisson步驟 Redisson各個鎖基本所用Redisson各個鎖基本所用Redisson各個鎖基本所用 二、源碼解析 lock鎖 1&#xff09; 基本思想&#xff1a; lock有兩種方法 一種是空參 另一種是帶參 * 空參方法&#xff1a;會默認調用看門狗的過期時間30*1000&…

內網穿透的應用-如何在本地安裝Flask,以及將其web界面發布到公網上并進行遠程訪問

輕量級web開發框架&#xff1a;Flask本地部署及實現公網訪問界面 文章目錄 輕量級web開發框架&#xff1a;Flask本地部署及實現公網訪問界面前言1. 安裝部署Flask2. 安裝Cpolar內網穿透3. 配置Flask的web界面公網訪問地址4. 公網遠程訪問Flask的web界面 前言 本篇文章講解如何…

linux環境下samba服務器的配置

linux服務器怎么創建用戶 在Linux服務器上&#xff0c;可以使用以下步驟創建用戶&#xff1a; 使用adduser命令創建新用戶&#xff1a; sudo adduser username將 username 替換為你要創建的用戶名。這個命令會提示你輸入新用戶的密碼以及其他相關信息。 如果需要為新用戶設…

qml PathPercent使用介紹

PathPercent 是一個QML類型,它表示 Path 上的一個百分比位置。這個類型通常在 PathAnimation 或 PathInterpolator 中使用,以便在路徑上產生一個特定的位置。它提供了一種方式來表示在 Path 元素上的某個點。通過 PathPercent,你可以指定一個百分比,來表示沿著路徑的位置,…

『亞馬遜云科技產品測評』活動征文|通過Lightsail搭建個人筆記

提示&#xff1a;授權聲明&#xff1a;本篇文章授權活動官方亞馬遜云科技文章轉發、改寫權&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒體平臺&#xff0c;第三方開發者媒體等亞馬遜云科技官方渠道 文章目錄 前言實踐知識儲備Lightsail介紹Leanote介紹實踐…

系統架構設計: 21 論敏捷軟件開發方法及其應用

論敏捷軟件開發方法及其應用 請圍繞“敏捷軟件開發方法及其應用”論題,依次從以下三個方面進行論述。 ①簡述你所參與開發的運用了敏捷技術的項目,以及你所擔任的工作; ②分析并討論敏捷<

VSCode插件koroFileHeader的使用。

文章目錄 前言一、koroFileHeader是什么&#xff1f;二、使用步驟1.安裝1.配置2.食用 前言 今天的天氣還不錯&#xff0c;真是金風玉露一相逢&#xff0c;便勝卻人間無數&#xff0c;寫篇博客玩玩&#xff0c;主題&#xff1a;注釋。注釋的本質就是對代碼的解釋和說明&#xf…

nginx 配置靜態緩存全教程 (以及靜態緩存文件沒有生成)

一、第一步定義一個緩存目錄設置目錄結構 在 http 模塊下定義(keys_zone 緩存區名&#xff1a;后面是緩存區大小 inactive 不活躍的文件多久清理 max_size 緩存區所占磁盤的上限 use_temp_path 默認關閉&#xff08;有需要自己百度&#xff09;) proxy_cache_path /path/your…

16 Go的反射

概述 在上一節的內容中&#xff0c;我們介紹了Go的并發&#xff0c;包括&#xff1a;Goroutines、Channels、WaitGroups、Mutex、Select等。在本節中&#xff0c;我們將介紹Go的反射。Go語言中的反射是一種在運行時檢查類型信息并操作對象的能力&#xff0c;通過反射&#xff0…

STM32_6(TIM)

TIM定時器&#xff08;第一部分&#xff09; TIM&#xff08;Timer&#xff09;定時器定時器可以對輸入的時鐘進行計數&#xff0c;并在計數值達到設定值時觸發中斷16位計數器、預分頻器、自動重裝寄存器的時基單元&#xff0c;在72MHz計數時鐘下可以實現最大59.65s的定時不僅…

在游戲開發中,實時渲染和離線渲染對于游戲平衡的影響有哪些?

實時渲染和離線渲染對游戲平衡有那些影響呢&#xff1f;在游戲開發中&#xff0c;渲染方式的選擇對游戲的整體表現和玩家體驗有著至關重要的作用。那么&#xff0c;實時渲染和離線渲染究竟有哪些利弊呢&#xff1f; 一、實時渲染 實時渲染&#xff0c;顧名思義&#xff0c;是…

Ubuntu 1.84.2Visual Studio Code 下載配置與vscode查看內存Hex Editor插件,簡單易懂

目錄 前言 一 首先我為啥要重裝Vs Code呢&#xff1f; 二 下載1.84.2Visual Studio Code 三 配置Vscode終端字體 四 安裝插件 前言 這是一篇將老版本的VsCode下載至最新版的博文&#xff0c;從下載到調試全篇 一 首先我為啥要重裝Vs Code呢&#xff1f; 因為我想安裝這個…

網絡安全深入學習第九課——本機信息收集

文章目錄 一、Windows基本信息收集1、查看當前權限2、查看指定用戶的詳細信息3、查看用戶SID4、查看網卡配置5、查看服務器版本\補丁等6、查看系統架構7、查看安裝的軟件及版本8、查看本機服務信息9、查詢進程信息和列表10、查看啟動程序信息11、查看計劃任務12、查看主機開機時…

1、postman的安裝及使用

一、安裝、登錄 1.安裝 下載地址 2.注冊登錄&#xff08;保存云服務進度&#xff09; 二、界面介紹 三、執行接口測試頁面 請求頁簽&#xff1a; 1、params&#xff1a;當是get請求時&#xff0c;通過params傳參 2、authorization&#xff1a;鑒權 3、headers&#xff1…

大數據-之LibrA數據庫系統告警處理(ALM-37000 MPPDBServer數據目錄或Redo目錄缺失)

告警解釋 當出現如下情況時&#xff0c;產生該告警&#xff1a; 數據實例數據目錄被刪除。數據實例Redo目錄&#xff08;pg_xlog&#xff09;被刪除。 告警屬性 告警ID 告警級別 可自動清除 37000 嚴重 是 告警參數 參數名稱 參數含義 ServiceName 產生告警的服務…

OTP語音芯片WTN6系列:多樣化選擇,滿足各種產品應用需求

隨著科技的快速發展&#xff0c;語音芯片已經成為了智能產品中不可或缺的核心組件。在這個領域中&#xff0c;唯創知音OTP語音芯片WTN6系列以其出色的性能和多樣化的選擇&#xff0c;贏得了廣大開發者的青睞。本文將詳細介紹WTN6系列的幾個重要型號及其特點&#xff0c;并為讀者…

idea 26 個天花板技巧

1、 查看代碼歷史版本&#xff1b;2、 調整idea的虛擬內存&#xff1a;&#xff1b;3、 idea設置成eclipse的快捷鍵&#xff1b;4、 設置提示詞忽略大小寫&#xff1b;5、 關閉代碼檢查&#xff1b;6、 設置文檔注釋模板&#xff1b;7、 顯示方法分隔符&#xff1b;8、 設置多行…