【C語言】文件的順序讀寫

?作者:末央&

?系列:C語言初階(適合小白入門)
?說明:以凡人之筆墨,書寫未來之大夢

在這里插入圖片描述

目錄

  • 前言
  • 字符輸入輸出函數 - fgetc和fputc
  • 文本行輸入輸出函數 - fgets和fputs
  • 格式化輸入輸出函數 - fscanf和fprintf

前言

對文件數據的讀寫可以分為順序讀寫和隨機讀寫。順序讀寫,即挨著順序對文件中的數據進行輸入或輸出。

在這片博客中,我們首先介紹文件的順序讀寫需要用到的文件操作函數。

字符輸入輸出函數 - fgetc和fputc

一、fputc函數

int fputc( int c, FILE *stream );

fputc函數的第一個參數是待輸出的字符,第二個參數該字符輸出的位置,即fputc函數的功能是將一個字符輸出到指定的位置。該函數調用完畢會返回用戶傳入的字符。

例如,我們要將小寫字母a~z寫入到data.txt文件中。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{//打開文件FILE* pf = fopen("data.txt", "w");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打開失敗,失敗返回}//對文件進行輸出字符操作char i = 0;for (i = 'a'; i <= 'z'; i++){fputc(i, pf);}//關閉文件fclose(pf);pf = NULL;return 0;
}

二、fgetc函數

int fgetc( FILE *stream );

fgetc函數只有一個參數,即你要讀取的文件的文件指針。fgets函數的功能就是從指定位置讀取一個字符。該函數調用成功會返回讀取到的的字符;若讀取文件時發生錯誤,或是已經讀取到文件末尾,則返回EOF。

例如,我們要將文件data.txt文件中的內容全部讀取,并打印到屏幕上。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{//打開文件FILE* pf = fopen("data.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打開失敗,失敗返回}//對文件進行輸入字符操作int ch = 0;while ((ch = fgetc(pf))!= EOF){printf("%c", ch);}//關閉文件fclose(pf);pf = NULL;return 0;
}

文本行輸入輸出函數 - fgets和fputs

一、fputs函數

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

fputs函數的第一個參數是待輸出的字符串,第二個參數該字符串輸出的位置,即fputs函數的功能是將一個字符串輸出到指定的位置(有沒有發現fputs函數的參數設計和fputc函數參數的設計非常類似)。該函數調用成功會返回一個非負值;若輸出時發生錯誤,則返回EOF。

例如,我們要將字符串"hello world!"寫入到data.txt文件中。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{//打開文件FILE* pf = fopen("data.txt", "w");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打開失敗,失敗返回}//對文件進行輸出字符串操作char arr[] = "hello world!";fputs(arr, pf);//關閉文件fclose(pf);pf = NULL;return 0;
}

二、fgets函數

char *fgets( char *string, int n, FILE *stream );

fgets函數的第三個參數是你要讀取的文件的文件指針,第二個參數是你要讀取的字符個數(也可以說是字節個數),第一個參數是你所讀取到的數據的儲存位置。fgets函數的功能就是從指定位置讀取指定字符個數的數據儲存到指定位置。該函數調用成功會返回用于儲存數據的位置的地址,如果讀取過程中發生錯誤,或是讀取到了文件末尾,則返回一個空指針(NULL)。

例如,我們要從data.txt文件中提取數據。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{//打開文件FILE* pf = fopen("data.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打開失敗,失敗返回}//對文件進行輸入字符串操作char arr[10] = { 0 };fgets(arr, 6, pf);printf("%s\n", arr);//關閉文件fclose(pf);pf = NULL;return 0;
}

fgets函數讀取字符的過程中會出現兩種情況:

  • 在fgets函數讀取到指定字符數之前,若讀取到換行符(’\n’),則停止讀取,讀取帶回的字符包含換行符。
  • 直到fgets函數讀取到第n-1個字符時都沒有遇到換行符(’\n’),則返回讀取到的n-1個字符,并在末尾加上一個空字符(一般是\0)一同返回(共n個字符)。

格式化輸入輸出函數 - fscanf和fprintf

一、fprintf函數

int fprintf( FILE *stream, const char *format [, argument ]...);

fprintf函數的第一個參數是數據輸出的目的地,后面的參數博友們可能看不太懂,但是我們可以看看庫函數printf函數的函數聲明:

int printf( const char *format [, argument]... );
//printf函數的聲明

我們發現fprintf函數除了第一個參數以外,其它參數都與printf函數的參數一樣,雖然我們不知道fprintf函數后面的參數代表的意思,但是我們會用printf函數啊,所以我們使用fprintf函數傳參時可以模仿者printf的傳參形式。

例如我們要將一個結構體類型的變量信息輸出到data.txt文件中去

#include <stdio.h>
#include <string.h>
#include <errno.h>
struct S
{char name[20];char sex[5];int age;
};
int main()
{//打開文件FILE* pf = fopen("data.txt", "w");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打開失敗,失敗返回}//對文件進行格式化輸出操作struct S s = { "zhangsan", "nan", 20 };fprintf(pf, "%s %s %d\n", s.name, s.sex, s.age);//關閉文件fclose(pf);pf = NULL;return 0;
}

在這里插入圖片描述
其實,fprintf函數的功能就是將“區域三”的數據,以“區域二”的格式輸出到“區域一”

二、fscanf函數

int fscanf( FILE *stream, const char *format [, argument ]... );

fscanf函數的第一個參數是讀取數據的位置,后面的參數我們也可以類比scanf函數的參數:

int scanf( const char *format [,argument]... );

我們可以看到fscanf函數的參數也是,除了第一個參數以外,其他參數就是scanf函數的參數,于是我們可以試著嘗試使用。

例如,我們要將剛才用fprintf函數輸出到data.txt文件中的數據讀取出來。

#include <stdio.h>
#include <string.h>
#include <errno.h>
struct S
{char name[20];char sex[5];int age;
};
int main()
{//打開文件FILE* pf = fopen("data.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打開失敗,失敗返回}//對文件進行格式化輸入操作struct S tmp = { 0 };fscanf(pf, "%s %s %d", tmp.name, tmp.sex, &(tmp.age));printf("%s %s %d\n", tmp.name, tmp.sex, tmp.age);//將tmp中的內容打印出來,看是否讀取成功//關閉文件fclose(pf);pf = NULL;return 0;
}

在這里插入圖片描述
其實,fscanf函數的功能就是將“區域一”的數據,以“區域二”的格式輸入到“區域三”。

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

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

相關文章

Unity3D 打造基于AStar的尋路與導航詳解

在游戲開發中&#xff0c;尋路與導航是一個至關重要的功能&#xff0c;它能夠使游戲角色自動找到最優路徑&#xff0c;避開障礙物&#xff0c;實現自動導航&#xff0c;從而提升游戲體驗。AStar&#xff08;A*&#xff09;算法作為一種廣泛應用的尋路算法&#xff0c;因其高效性…

關于多線程的使用方法

多線程在python中應用比較廣泛&#xff0c;但是因為python中有GIL鎖的緣故&#xff0c;在多線程中看起來是并發的執行的&#xff0c;在宏觀上是并發執行的&#xff0c;但是在微觀上是一個接著一個執行。 在python中使用多線程比較簡單&#xff0c;是一套固定的模版。 from qu…

PHP利用GD庫實現圖片合成功能方法

在程序項目開發的過程中我們免不了要實現一種功能。例如海報的生成&#xff0c;照片和文字合成一張新的圖片。php中怎么實現 實現功能 文字和照片合成一張新的照片&#xff0c;并且自適應換行并加上簽名和日期&#xff0c;加上字體樣式&#xff0c;下面我們就開實現該功能 實現…

Seal^_^【送書活動第8期】——《ChatGLM3大模型本地化部署、應用開發與微調》

Seal^_^【送書活動第8期】——《ChatGLM3大模型本地化部署、應用開發與微調》 一、參與方式二、本期推薦圖書2.1 作者建語2.2 編輯推建2.3 圖書簡介2.4 前 言2.5 目 錄 三、正版購買 大模型領域 既是繁星點點的未知宇宙&#xff0c;也是蘊含無數可能的廣闊天地&#xff0c; 正…

深入理解 Linux 內核架構

目錄 引言內核概念Linux 內核的基本組成 進程管理內存管理文件系統設備驅動網絡棧內核結構 內核態與用戶態內核模塊系統調用中斷與異常處理內核同步機制Linux 內核使用場景常用的內核命令與工具內核調試與性能優化總結 1. 引言 Linux 內核是現代計算機系統的核心組件之一&am…

python--基礎知識點--協程

協程由用戶態控制&#xff0c;不由內核控制1個線程中可以開很多協程協程切換是在用戶態控制不由內核控制&#xff0c;切換時資源開銷小使用方式&#xff1a;async def、await可等待對象(協程對象、Future對象、task對象(是Future對象的子類)->io等待)、事件循環使用場景&…

idea創建自定義的maven spark scala archetype腳手架

一&#xff1a;先創建一個Maven項目net.alchim31.maven&#xff08;選該模板&#xff0c;得要等一會兒才能加載出來&#xff09; 之后將自己的目錄結構建立好&#xff0c;最好不要有空目錄&#xff0c;可能會因為沒有文件在install的時候編譯不進去 pom中內容也按照自己的需要改…

Stable Diffusion web UI 插件

2024.7.3更新&#xff0c;持續更新中 如果需要在linux上自己安裝sd&#xff0c;參考&#xff1a;stable diffusion linux安裝 插件復制到 /stable-diffusion-webui/extensions 目錄下&#xff0c;然后重新啟動sd即可 一、插件安裝方法 每種插件的安裝方法可能略有不同&#xf…

蘋果p12證書最簡單最新申請流程

使用uniapp打包&#xff0c;在ios上打正式包需要蘋果的p12證書和證書profile文件&#xff0c;點進去uniapp的ios證書申請教程&#xff0c;通篇就是使用mac電腦申請的教程&#xff0c;假如沒有mac電腦就無法繼續了。 因此&#xff0c;假如沒有mac電腦的同志們&#xff0c;可以參…

高薪程序員必修課-Java中為什么不建議使用Executors來創建線程池?

目錄 前言 原因分析 1. newFixedThreadPool 和 newSingleThreadExecutor 示例&#xff1a; 2. newCachedThreadPool 示例&#xff1a; 建議的替代方法 示例&#xff1a; 解釋&#xff1a; 總結 前言 在Java中&#xff0c;Executors 類提供了幾個工廠方法來創建不同類型…

RAG開源項目Qanything源碼閱讀3-在線推理

原文&#xff1a;前沿重器[47] | RAG開源項目Qanything源碼閱讀3-在線推理 項目&#xff1a;https://github.com/netease-youdao/QAnything 第一篇&#xff1a;RAG開源項目Qanything源碼閱讀1-概述服務 第二篇&#xff1a;RAG開源項目Qanything源碼閱讀2-離線文件處理 0&#x…

Pytest+Allure+Yaml+PyMsql+Jenkins+Gitlab接口自動化(五)Jenkins配置

一、背景 Jenkins&#xff08;本地宿主機搭建&#xff09; 拉取GitLab(服務器)代碼到在Jenkins工作空間本地運行并生成Allure測試報告 二、框架改動點 框架主運行程序需要先注釋掉運行代碼&#xff08;可不改&#xff0c;如果運行報allure找不到就直接注釋掉&#xff09; …

中英雙語介紹美國的州:路易斯安那州(Louisiana)

中文版 路易斯安那州簡介 路易斯安那州位于美國南部&#xff0c;以其豐富的歷史文化、多樣的自然景觀和獨特的音樂和美食傳統而聞名。以下是對路易斯安那州的詳細介紹&#xff0c;包括其地理位置、人口、經濟、教育、文化和主要城市。 地理位置 路易斯安那州東臨密西西比州…

鴻蒙應用開發-時間屏幕

點擊下載源碼&#xff1a; https://download.csdn.net/download/liuhaikang/89509449 做一個時間屏幕&#xff0c;可以點擊切換白色和黑色&#xff0c;有漸變效果&#xff0c;使用到了鴻蒙的動畫效果。 在這個設計中&#xff0c;我們首先引入了通用能力包&#xff0c;以實現功…

Kubernetes 離線安裝的坑我采了

Kubernetes 離線安裝的坑我采了 一、Error from server: Get "https://xx.xx.xx.xx:10250/containerLogs/kube-system/calico-node-8dnvs/calico-node": tls: failed to verify certificate: x509: certificate signed by unknown authority二、calico 或 pod 啟動正…

cesium公交車軌跡漫游

個人博客&#xff1a;CSDN 博客-滿分觀察網友 z 演示地址&#xff1a;嗶哩嗶哩-滿分觀察網友 z 這是一個用 Cesium.js 做的公交車軌跡漫游&#xff0c;實現的功能有加載站點和道路軌跡點數據、監聽車輛的實時位置、車輛控制器。滾動屏等等。 文章目錄 1. 地圖初始化2. 數據渲…

【高中數學/基本不等式】已知:x,y均為正實數,且xy+2x+y=4 求:x+y的最小值?

【問題】 已知&#xff1a;x,y均為正實數&#xff0c;且xy2xy4 求&#xff1a;xy的最小值&#xff1f; 【來源】 https://www.ixigua.com/7147585275823292942?logTagf25494de7fce23a3a3d0 【解答】 解&#xff1a; 由xy2xy4 兩邊加二得 xy2xy24 2 分解因式得 (x1)(…

0090__【Git系列】merge和rebase的區別

【Git系列】merge和rebase的區別_rebase和merge的區別-CSDN博客 git中rebase和merge的區別是什么-git-PHP中文網 https://blog.51cto.com/qzcsbj/9444199

從零搭建教育管理系統:Java + Vue.js 教學-02

第三步:創建實體類和 Mapper 接口 現在我們已經設計好了數據庫表,接下來使用 MyBatis-Plus 將這些表映射到 Java 對象,以便在代碼中輕松地進行操作。 1. 創建實體類 在 src/main/java/<your_package>/entity 目錄下 (如果沒有該目錄,請手動創建),創建與數據庫表對應…

MyBatis(20)MyBatis 事務管理如何實現

MyBatis 的事務管理是通過底層 JDBC 連接的事務管理機制來實現的。事務管理對于任何涉及多個數據庫操作的應用程序來說都是至關重要的&#xff0c;它確保數據的一致性和完整性。在 MyBatis 中&#xff0c;事務管理可以通過 SQL 會話&#xff08;SqlSession&#xff09;來實現。…