文件的順序讀寫函數舉例介紹

目錄

  • 例1:(使用字符輸出函數fputc)
  • 例2:(使用字符輸入函數fgetc)
  • 例3:(使用文本行輸出函數fputs )
  • 例4:(使用文本行輸入函數fgets )
  • 例5:(使用格式化輸出函數fprintf)
  • 例6:(使用格式化輸入函數fscanf)
  • 例7:(使用二進制輸出函數fwrite)
  • 例8:(使用二進制輸入函數fread)
  • 補充1:(sprintf函數)
  • 補充2:(sscanf函數)

結構:

//主函數
int main()
{//打開文件(寫"w"/讀"r")FILE* pF = fopen("myfile.txt", "w");//判斷文件是否存在if (pF == NULL){perror("fopen");return 1;}//進行寫/讀操作//關閉文件fclose(pF);pF = NULL;return 0;
}

stream在此例中都為pF,代表指向標識輸出流的FILE對象的指針

例1:(使用字符輸出函數fputc)

	FILE* pF = fopen("myfile.txt", "w");//使用循環int i = 0;for (i = 0; i < 26; i++){//打印在文件中fputc('a' + i, pF);//打印在屏幕上fputc('a' + i, stdout);}

fputc的使用:int fputc ( int character, FILE * stream );

  1. 字符character被寫入流stream的內部位置
  2. 指示器所指示的位置,然后自動向前移動一個。

運行后:
在這里插入圖片描述

例2:(使用字符輸入函數fgetc)

	 FILE* pF = fopen("myfile.txt", "r");//讀文件int ch = fgetc(pF);printf("%c\n", ch);ch = fgetc(pF);printf("%c\n", ch);ch = fgetc(pF);printf("%c\n", ch);ch = fgetc(pF);printf("%c\n", ch);

fgetc的使用:int fgetc ( FILE * stream );

  1. 返回指定流stream 的內部文件位置指示符當前指向的字符,然后將內部文件位置指示符推進到下一個字符
  2. 如果流在被調用時位于文件的末尾,則該函數返回EOF并為流stream 設置文件結束指示器(feof)
  3. 如果發生讀錯誤,該函數返回EOF并設置流stream 的錯誤指示器(error)

運行后:
在這里插入圖片描述

例3:(使用文本行輸出函數fputs )

	FILE* pF = fopen("myfile.txt", "w");//寫文本文件fputs("hello word\n", pF);fputs("hello real word\n", pF);//打印在屏幕上fputs("hello word\n", stdout);

fputs的使用:int fputs ( const char * str, FILE * stream );

  1. 函數從指定的地址(str)開始復制,直到到達結束的空字符(‘\0’)
  2. 這個終止的空字符不會復制到流stream
  3. fputs不會寫入額外的字符,換行需要自己加上'\n'

運行后:
在這里插入圖片描述

例4:(使用文本行輸入函數fgets )

	FILE* pF = fopen("myfile.txt", "r");//讀文本文件char arr[10] = { 0 };fgets(arr, 10, pF);printf("%s\n", arr);fgets(arr, 10, pF);printf("%s\n", arr);

fgets的使用:char * fgets ( char * str, int num, FILE * stream );

  1. 從流stream中讀取字符,并將其作為字符串存儲到str中,直到讀取(num-1)個字符,或者到達換行符或文件結束符,以先發生的為準。
  2. 換行符使fgets停止讀取,但它被函數認為是一個有效字符,并包含在復制到str的字符串中
  3. 若先讀取到(num-1)個字符,則需要自行添加'\n'使得在打印屏幕上顯示出換行
  4. 在復制到str的字符之后,將自動追加一個終止null字符

運行后:
在這里插入圖片描述

例5:(使用格式化輸出函數fprintf)

//結構體
struct S
{int a;float f;
};//主函數FILE* pF = fopen("myfile.txt", "w");//寫文本文件struct S s = { 100,3.14f };//打印在文本內fprintf(pF, "%d %f", s.a, s.f);//打印在屏幕上fprintf(stdout, "%d %f", s.a, s.f);

fprintf的使用:int fprintf ( FILE * stream, const char * format, ... );

  1. printf的區別僅在于形參FILE * stream
  2. printf的用法上加上參數流stream

運行后:
在這里插入圖片描述

例6:(使用格式化輸入函數fscanf)

//結構體
struct S
{int a;float f;
};//主函數FILE* pF = fopen("myfile.txt", "r");//從文本內讀取struct S s = { 100,3.14f };fscanf(pF, "%d %f", &(s.a), &(s.f));//打印在屏幕上printf("%d %f", s.a, s.f);

fscanf的使用:int fscanf ( FILE * stream, const char * format, ... );

  1. scanf的區別僅在于形參FILE * stream
  2. scanf的用法上加上參數流stream

運行后:
在這里插入圖片描述

例7:(使用二進制輸出函數fwrite)

//結構體
struct S
{int a;float f;char str[10];
};
//主函數FILE* pF = fopen("myfile.txt", "wb");//寫文件struct S s = { 100,3.14f,"hello"};fwrite(&s, sizeof(struct S), 1, pF);

fwrite的使用:size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

  1. 將由count元素組成的數組(每個元素的大小為size字節)從ptr所指向的內存塊寫入流stream 中的當前位置
  2. stream 的位置指示器按寫入的總字節數前進
  3. 在內部,該函數將ptr指向的塊解釋為unsigned char類型的(size*count)元素數組,并將它們順序寫入流stream

運行后:
在這里插入圖片描述
文本文件中為亂碼的原因:fwrite寫入文本中的為二進制編碼,無法直接顯示出,用fread函數可以讀取出

例8:(使用二進制輸入函數fread)

//結構體
struct S
{int a;float f;char str[10];
};
//主函數FILE* pF = fopen("myfile.txt", "rb");//讀文件struct S s = { 0 };fread(&s, sizeof(struct S), 1, pF);printf("%d %f %s\n", s.a, s.f, s.str);

fread的使用:size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

  1. 從流stream 中讀取一個由count元素組成的數組,每個元素的大小為size字節,并將它們存儲在ptr指定的內存塊中
  2. stream 的位置指示器按讀取的總字節數前進
  3. 如果成功讀取的總字節數為(size*count)

運用后:
在這里插入圖片描述

補充1:(sprintf函數)

int sprintf ( char * str, const char * format, ... );

將格式化的數據,轉換為字符串

  1. 如果在printf上使用format,則使用將打印的相同文本組成一個字符串,但不是打印,而是將內容作為字符串存儲在str指向的緩沖區中
  2. 緩沖區的大小應該大到足以包含整個結果字符串
  3. 在內容之后自動附加一個終止null字符
struct S
{int a;float f;char str[10];
};
int main()
{char arr[30] = { 0 };struct S s = { 100,3.14f,"hehe"};sprintf(arr, "%d %f %s", s.a, s.f, s.str);printf("%s\n", arr);return 0;
}

將結構體struct S s中的數據按照"%d %f %s"的格式,轉化為字符串存儲在arr指向的緩沖區中

觀察arr內的變化
在這里插入圖片描述

補充2:(sscanf函數)

int sscanf ( const char * s, const char * format, ...);

從字符串中讀取格式化的數據

  1. s中讀取數據,并根據參數格式將其存儲到附加參數給出的位置,就像使用了scanf一樣,但從s中讀取數據,而不是從標準輸入(stdin)中讀取
  2. 額外的參數應該指向已經分配的對象,其類型由格式字符串中相應的格式說明符指定
struct S
{int a;float f;char str[10];
};
int main()
{char arr[30] = { 0 };struct S s = { 100,3.14f,"hehe" };struct S tmp = { 0 };sprintf(arr, "%d %f %s", s.a, s.f, s.str);sscanf(arr, "%d %f %s", &(tmp.a), &(tmp.f), tmp.str);printf("%d %f %s\n", tmp.a, tmp.f, tmp.str);return 0;
}

arr中讀取數據,由"%d %f %s"的格式字符串中相應的格式說明符指定分配到結構體struct S tmp

觀察數據變化
在這里插入圖片描述

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

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

相關文章

Docker基礎教程 - 2 Docker安裝

更好的閱讀體驗&#xff1a;點這里 &#xff08; www.doubibiji.com &#xff09; 2 Docker安裝 Docker 的官網地址&#xff1a;https://www.docker.com/&#xff0c;在官網可以找到 Docker Engine 的安裝步驟。 下面進行 Docker 環境的安裝&#xff0c;正常情況下 Docker …

服務發現:CP or AP?

1 服務發現的意義 為高可用&#xff0c;生產環境中服務提供方都以集群對外提供服務&#xff0c;集群里這些IP隨時可能變化&#xff0c;也需要用一本“通信錄”及時獲取對應服務節點&#xff0c;這獲取過程即“服務發現”。 對服務調用方和服務提供方&#xff0c;其契約就是接…

(3)(3.1) FlightDeck FrSky發射器應用程序

文章目錄 前言 1 概述 2 Turnkey Packages 3 參數說明 前言 ?Craft and Theory 的 FlightDeck 可讓你輕松查看飛行模式、高度、速度、姿態和關鍵系統警報&#xff0c;包括故障保護和電池錯誤&#xff0c;如電池不平衡警告和發射機低電量警報。 1 概述 Craft and Theory 的…

【自然語言處理】NLP入門(二):1、正則表達式與Python中的實現(2):字符串格式化輸出(%、format()、f-string)

文章目錄 一、前言二、正則表達式與Python中的實現1.字符串構造2. 字符串截取3. 字符串格式化輸出3.1 %符號格式化字符串1. 一般形式2. 常用格式字符3. 最小寬度和精度4. 進位制和科學計數法5. 多個對象的格式化輸出6. 典例 3.2 format()方法格式化字符串1. 一般形式2. 參數傳遞…

51單片機-(中斷系統)

51單片機-&#xff08;中斷系統&#xff09; 了解51單片機中斷系統、中斷源、中斷響應條件和優先級等&#xff0c;通過外部中斷0實現按鍵控制LED亮滅為例理解中斷工作原理和編程實現過程。 1.中斷系統結構 89C51/52的中斷系統有5個中斷源 &#xff0c;2個優先級&#xff0c;…

WiFi模塊引領智能家居革命:連接未來的生活

隨著科技的快速發展&#xff0c;智能家居正成為現代生活的一部分&#xff0c;極大地改變了我們與家庭環境互動的方式。其中&#xff0c;WiFi模塊作為關鍵的連接技術&#xff0c;在推動智能家居革命中發揮著不可忽視的作用。本文將深入探討WiFi模塊如何驅動智能家居革命。 設備互…

1027 打印沙漏

本題要求你寫個程序把給定的符號打印成沙漏的形狀。例如給定17個“*”&#xff0c;要求按下列格式打印 ***** *** * *** ***** 所謂“沙漏形狀”&#xff0c;是指每行輸出奇數個符號&#xff1b;各行符號中心對齊&#xff1b;相鄰兩行符號數差2&#xff1b;符號數先從大到…

多線程:線程通信

線程通信 什么是線程通信 當多個線程共同操作共享的資源時&#xff0c;線程間通過某種方式互相告知自己的的狀態&#xff0c;以相互協調&#xff0c;并避免無效的資源爭奪。 線程通信的常見模型&#xff08;生產者與消費者模型&#xff09; 生產者線程負責生產數據消費者線…

對抽象工廠模式的理解

目錄 1 背景1.1 題目描述1.2 輸入描述1.3 輸出描述1.4 輸入示例1.5 輸出示例 2 抽象工廠模式3 思考3.1 我的實現3.2 什么時候用抽象工廠模式&#xff1f;&#xff08;怎么用才是合適的&#xff1f;&#xff09;3.3 [更好的例子](https://refactoringguru.cn/design-patterns/ab…

【探索Linux】—— 強大的命令行工具 P.24(網絡基礎)

閱讀導航 引言一、計算機網絡背景1. 網絡發展歷史 二、認識 "協議"1. 網絡協議概念2. 網絡協議初識&#xff08;1&#xff09;協議分層&#xff08;2&#xff09;OSI參考模型&#xff08;Open Systems Interconnection Reference Model&#xff09;&#xff08;3&…

NoSQL--1.虛擬機網絡配置

目錄 1.初識NoSQL 1.1 NoSQL之虛擬機網絡配置 1.1.1 首先&#xff0c;導入預先配置好的NoSQL版本到VMware Workstation中 1.1.2 開啟虛擬機操作&#xff1a; 1.1.2.1 點擊開啟虛擬機&#xff1a; 1.1.2.2 默認選擇回車CentOS Linux&#xff08;3.10.0-1127.e17.x86_64) 7 …

cobalt strike釣魚lnk報錯:無法連接到遠程服務器

筆者在學習 cobalt strike 制作釣魚文件時發現多次失敗&#xff0c;在 win10 虛擬機的 powershell 的多次排查后發現這樣一個報錯&#xff1a; 使用“1”個參數調用“DownloadString”時發生異常:“無法連接到遠程服務器“ 經過多次排查后發現問題出在 cs 的 team server上&…

解決:Glide 在回調中再次加載圖片報錯

一、問題說明 Glide 加載圖片時監聽了回調&#xff0c;并在失敗時再次加載其它圖片后報錯。 代碼&#xff1a; Glide.with(mContext).load(imgTeacher).listener(new RequestListener<Drawable>() {Overridepublic boolean onLoadFailed(Nullable GlideException e, O…

MCU 串口接收環形緩沖區的實現

環形緩沖區 1. 環形緩沖區的特性 1.先進先出 2. 當緩沖區被使用完&#xff0c;且又有新的數據需要存儲時&#xff0c;丟掉歷史最久的數據&#xff0c;保存最新的數據 現實中的存儲介質都是線性的&#xff0c;因此我們需要做一下處理&#xff0c;才能在功能上實現環形緩沖區 …

[計算機網絡]--I/O多路轉接之poll和epoll

前言 作者&#xff1a;小蝸牛向前沖 名言&#xff1a;我可以接受失敗&#xff0c;但我不能接受放棄 如果覺的博主的文章還不錯的話&#xff0c;還請點贊&#xff0c;收藏&#xff0c;關注&#x1f440;支持博主。如果發現有問題的地方歡迎?大家在評論區指正 目錄 一、poll函…

web漏洞與規避

文章目錄 一、XSS 跨站腳本攻擊1.1 XSS攻擊的主要類型反射型XSS存儲型XSSDOM型XSS 1.2 前端開發如何應對XSS 二、CSRF 跨站請求偽造2.1 CSRF例子2.2 前端開發如何應對CSRF 三、SQL 注入3.1 前端如何防御SQL注入 四、前端如何使用CSP 一、XSS 跨站腳本攻擊 攻擊者通過在受害者的…

stm32學習筆記:IIC通信(未完)

概述 第一塊&#xff1a;介紹協議規則&#xff0c;然后用軟件模擬的形式來實現協議。 第二塊&#xff1a;介紹STM32的iic外設&#xff0c;然后用硬件來實現協議。 程序一現象&#xff1a;通過軟件I2C通信&#xff0c;對MPU6050芯片內部的寄存器進行讀寫&#xff0c;寫入到配…

【Synchronized同步原理】

Synchronized同步原理 1. synchronized的使用&#xff1f;2. 如何保證線程安全的&#xff1f;3.可重入原理&#xff08;加鎖次數計數器&#xff09;4. 原子性和可見性(順序性) 1. synchronized的使用&#xff1f; 對象鎖方法鎖類鎖 2. 如何保證線程安全的&#xff1f; publi…

關于數據提交上傳服務端的數據類型以及項目打包上線的流程

1 請求頭的類型&#xff1a; content-type&#xff1b; 01: application/json 數據以json格式請求&#xff1a;{"key":"value"} 02: application/x-www.form-urlencoded from表單的數據格式 name"zs"&age12 03 mutipart/form-data…

重學SpringBoot3-自動配置機制

重學SpringBoot3-自動配置機制 引言Spring Boot 自動配置原理示例&#xff1a;Spring Boot Web 自動配置深入理解總結相關閱讀 引言 Spring Boot 的自動配置是其最強大的特性之一&#xff0c;它允許開發者通過最少的配置實現應用程序的快速開發和部署。這一切都得益于 Spring …