Linux 文件操作-標準IO函數3- fread讀取、fwrite寫入、 fprintf向文件寫入格式化數據、fscanf逐行讀取格式化數據的驗證

目錄

1.?fread?從文件中讀取數據

1.1 讀取次數 × 每次讀取字節數 < 原內容字節數

1.2?讀取次數 × 每次讀取字節數 >?原內容字節數

2.fwrite 向文件中寫入數據

2.1寫入字符串驗證

2.2寫入結構體驗證

3.?fprintf?將數據寫入到指定文件

4. fscanf 從文件中逐行讀取內容,并將其存儲在結構中

4.1 讀取整形、浮點型、字符程序:

4.2?讀取結構體程序:

4.2.1讀取 空格 間隔數據

4.2.2讀取 空格-空格 間隔數據

5.fprintf 和 fscanf 聯合使用


1.?fread?從文件中讀取數據

函數原型:

/* 功能:從文件中讀取數據
參數:
ptr:保存讀取的數據
size:每次讀取的字節數
nmemb:一共讀取的次數
stream:文件指針返回值:成功:實際讀取的次數(對象數、塊數)失敗:0如果文件內容讀取完畢,返回0 */
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

1.1 讀取次數 × 每次讀取字節數 < 原內容字節數

程序:file.txt 共32個字節,程序讀取3次,每次6個字節,共18個字節。

#include <stdio.h>int test1()
{FILE *fp = NULL;//只讀打開 file.txtfp = fopen("./file.txt", "r");if(fp == NULL){printf("fail to fopen\n");return -1;}//使用fread函數讀取文件內容int num;char buf[64] = {0};//從fp中讀取3次數據,每次讀取6個字節,保存到bufnum = fread(buf, 6, 3, fp);printf("buf = %s\n", buf);printf("num = %d\n", num);if(num == 0){printf(" fail to fread \n", num);}fclose(fp);  	 	return 0;
}int main(int argc, char *argv[])
{test1();return 0;
}

運行結果:

1.2?讀取次數 × 每次讀取字節數 >?原內容字節數

?例: fread(buf, size, num, fp); //讀取num次,每次size個字節大小。

若:如果讀到 n*size 個字節,返回值為 n?

.....
?如果讀到了大于等于2*size 個字節, 小于3*size個字節, 返回值為 2
?讀到的字節數,大于等于size 個字節 ,小于2*size個字節, 返回值為 1
?不到size 個字節,返回值為 0?


int num?= fread(str,10,3,fp);
讀取的字節數為 ,每次讀取10個字節,讀3次,?返回值為num。


?如果讀到30個字節,返回值num為3
?如果讀到了大于等于20個字節,小于30個字節, 返回值為2
?讀到的字節數,大于等于10個字節,小于20個字節 返回值為1
?不到10個字節,返回值為0

程序:

#include <stdio.h>int test1()
{FILE *fp = NULL;//只讀打開 file.txtfp = fopen("./file.txt", "r");if(fp == NULL){printf("fail to fopen\n");return -1;}//使用fread函數讀取文件內容int num;char buf[64] = {0};//從fp中讀取3次數據,每次讀取6個字節,保存到bufnum = fread(buf, 30, 3, fp);printf("buf = %s\n", buf);printf("num = %d\n", num);if(num == 0){printf(" fail to fread \n", num);}fclose(fp);  	 	return 0;
}int main(int argc, char *argv[])
{test1();return 0;
}

運行結果:修改程序每次讀取字節數

(1)num = fread(buf, 30, 3, fp);

(2)num = fread(buf, 15, 3, fp);

(3)num = fread(buf, 35, 3, fp);

2.fwrite 向文件中寫入數據

函數原型:

/*功能:向文件中寫入數據
參數:
ptr:要寫入的數據
size:一次寫入的字節數
nmemb:一共寫入的次數
stream:文件指針返回值:成功:實際寫入的次數失敗:0 */
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

2.1寫入字符串驗證

程序:

#include <stdio.h>
#include <string.h>int test1()
{FILE *fp = NULL;//讀寫打開 file.txt,不存在創建,存在清0fp = fopen("./file.txt", "w+");if(fp == NULL){printf("fail to fopen\n");return -1;}int num;char buf[] = {"hello world"};//向fp中寫入3次數據,每次寫入strlen(buf)個字節,num = fwrite(buf, strlen(buf), 3, fp);printf("strlen(buf) = %d\n", strlen(buf));printf("fwrite num = %d\n", num);printf("fwrite size = %d\n", num*strlen(buf));//向文件寫入字節大小if(num == 0){printf(" fail to fwrite \n", num);}//將文件的偏移量設置為文件的起始位置rewind(fp);//使用fread函數讀取文件內容char buf1[128] = {0};//從fp中讀取3次數據,每次讀取strlen(buf)個字節,保存到buf1num = fread(buf1, strlen(buf), 3, fp);printf("fread num = %d\n", num);printf("buf1  = %s\n", buf1);printf("strlen(buf1) = %d\n", strlen(buf1));if(num == 0){printf(" fail to fread \n", num);}fclose(fp);  	 	return 0;}int main(int argc, char *argv[])
{test1();return 0;
}

運行結果:對file.txt寫入3次hello world ,每次寫入11個字節

2.2寫入結構體驗證

程序:

#include <stdio.h>
#include <string.h>typedef struct{int i1;int i2;char c1;char c2;
}DATA;int test2()
{FILE *fp = NULL;fp = fopen("./file1.txt", "w+");if(fp == NULL){printf("fail to fopen\n");return -1;}//使用fwrite向文件寫入一個結構體DATA data[3] = {1, 2, 'a', 'b', 3, 4, 'c', 'd', 5, 6, 'e', 'f',};//向fp寫入3次數據,每次sizeof(DATA)個字節int num = fwrite(data, sizeof(DATA), 3, fp);printf("fwrite num = %d\n", num);//將文件的偏移量設置為文件的起始位置,不設為起始,讀取位置將從寫入最后一個字節之后開始。rewind(fp);DATA read_data[3];//從fp讀取寫入數據,每次sizeof(DATA)個字節,讀取3次數據int num1 = fread(read_data, sizeof(DATA), 3, fp);printf("fread num = %d\n", num1);int j;for(j = 0; j < 3; j++) //循環讀取read_data數據{printf("%d - %d - %c - %c\n", read_data[j].i1, read_data[j].i2, read_data[j].c1,  read_data[j].c2);}fclose(fp);  	 	return 0;
}int main(int argc, char *argv[])
{test2();return 0;
}

運行結果:

3.?fprintf?將數據寫入到指定文件

函數原型:

/*  fprintf 和printf函數類似:printf是將數據輸出到屏幕上(標準輸出),fprintf函數是將數據輸出到文件指針所指定的文件中。 *//* 參數?:
stream:文件指針,指定輸出目標(如文件、stdout、stderr)。
format:格式化字符串,定義輸出格式(如 %d, %s, %f)。
...:可變參數列表,對應 format 中的格式說明符。
?返回值?:成功時返回寫入的字符數,失敗時返回負值。 */int fprintf(FILE *stream, const char *format, ...);

程序:

#include <stdio.h>
#include <string.h>int test1()
{char ch='a';int num=10;char str[20]="hello world";float score = 68.9;FILE *fp = NULL;//讀寫打開 file.txtfp = fopen("./file.txt", "w+");if(fp == NULL){printf("fail to fopen\n");return -1;}//使用fprintf向文件寫入字符串int num1 = fprintf(fp,"%c %d %s %f\n",ch,num,str,score);printf("fprintf num = %d\n", num1);if(num1 < 0){printf(" fail to fprintf \n");return -1;}fclose(fp);  	 	return 0;
}int main(int argc, char *argv[])
{test1();return 0;
}

運行結果:

4. fscanf 從文件中逐行讀取內容,并將其存儲在結構中

函數原型:

 /* fscanf和scanf 函數類似:scanf是從鍵盤(標準輸入)獲取輸入,fscanf是從文件指針所標示的文件中獲取輸入。 *//* 參數?:
stream:文件指針(如 FILE *fp 或 stdin)?。
format:格式字符串,定義輸入數據的格式(如 %d, %s, %f)?。
...:可變參數列表,需為變量地址(如 &num, name 數組名)? ?返回值?:
成功時,返回輸入數據格式數量?(%d %s 等成功讀取的個數)。
失敗或 文件結尾返回 EOF(即 -1)? */int fscanf(FILE *stream, const char *format, ...)

4.1 讀取整形、浮點型、字符程序:

#include <stdio.h>
#include <string.h>int test1()
{     char ch;int num;char str[32] = "";float score ;FILE *fp = NULL;//追加讀寫打開 file.txtfp = fopen("./file.txt", "r");if(fp == NULL){printf("fail to fopen\n");return -1;}//將文件的偏移量設置為文件的起始位置,不設為起始,讀取位置將從寫入最后一個字節之后開始。//rewind(fp);//從指定文件讀取數據int num1 = fscanf(fp,"%c %d %s %f\n", &ch, &num, &str, &score);printf("ch= %c num= %d str= %s score= %f\n", ch, num, str, score);printf("fprintf num1 = %d\n", num1);if(num1 == EOF){printf(" fprintf fail or end \n");return -1;}return 0;
}int main(int argc, char *argv[])
{test1();fclose(fp);return 0;
}

運行結果:

file.txt原有內容:

4.2?讀取結構體程序:

4.2.1讀取 空格 間隔數據

程序:

#include <stdio.h>
#include <string.h>typedef struct
{char name[32];int age;   int score;
}DATA;int test2()//循環讀取文件內容
{FILE *fp = NULL;//只讀打開 file.txtfp = fopen("./file1.txt", "r");if(fp == NULL){printf("fail to fopen\n");return -1;}DATA dt;//從指定文件循環讀取一行數據while(fscanf(fp, "%s %d %d\n", dt.name,  &dt.age, &dt.score) == 3) //char name[32];{printf("name= %s age= %d score= %d\n", dt.name, dt.age, dt.score );}fclose(fp);return 0;
}int main(int argc, char *argv[])
{test2();	return 0;
}

運行結果:

注意fscanf第二個參數要與文件數據格式保持一致。

fscanf(fp, "%s %d %d", dt.name,  &dt.age, &dt.score);

4.2.2讀取 空格-空格 間隔數據

程序:

#include <stdio.h>
#include <string.h>typedef struct
{char name[32];int age;   int score;
}DATA;int test2()//循環讀取文件內容
{FILE *fp = NULL;//只讀打開 file.txtfp = fopen("./file1.txt", "r");if(fp == NULL){printf("fail to fopen\n");return -1;}DATA dt;//fprintf 和 fscanf 聯合使用,fprintf寫入文本時加入\n,在fscanf讀取時也要加\n。
//單獨使用fscanf讀取多行數據時,可不加\n//從指定文件循環讀取一行數據while(fscanf(fp, "%s - %d - %d", dt.name,  &dt.age, &dt.score) == 3)//while(fscanf(fp, "%s - %d - %d\n", dt.name,  &dt.age, &dt.score) == 3){printf("name= %s age= %d score= %d\n", dt.name, dt.age, dt.score );}fclose(fp);return 0;
}int main(int argc, char *argv[])
{test2();	return 0;
}

運行結果:注意fscanf第二個參數要與文件數據格式保持一致。

fscanf(fp, "%s - %d - %d", dt.name, &dt.age, &dt.score);

5.fprintf 和 fscanf 聯合使用

程序:

#include <stdio.h>
#include <string.h>int test4()//
{FILE *fp = NULL;//讀寫打開 file.txtfp = fopen("./file.txt", "w+");if(fp == NULL){printf("fail to fopen\n");return -1;}int num = 0;char ch1 = 'a', ch11;int i1 = 1, i11;char ch2 = 'e', ch22;int i2 = 10, i22;int j = 0;for(j = 0;j < 3;j++){//使用fprintf向文件寫入字符串num = fprintf(fp,"%c %d %c %d\n",ch1 + j, i1 + j, ch2 + j, i2 + j);if(num < 0){printf("fail to fprintf\n");}}//將文件的偏移量設置為文件的起始位置,不設為起始,讀取位置將從寫入最后一個字節之后開始。rewind(fp);//fprintf 和 fscanf 聯合使用,fprintf寫入文本時加入\n,在fscanf讀取時也要加\n。
//單獨使用fscanf讀取多行數據時,可不加\n//從指定文件循環讀取一行數據//while(fscanf(fp, "%c %d %c %d\n",&ch11 , &i11 , &ch22 , &i22) == 4) {printf("read:%c %d %c %d\n", ch11 , i11 , ch22 , i22 );}fclose(fp);return 0;
}int main(int argc, char *argv[])
{test4();return 0;
}

運行結果:

注意:(1)寫入文件后,將偏移量移至文件開頭。 // rewind(fp);

(2)程序寫入了 \n;

fprintf(fp,"%c %d %c %d\n",ch1 + j, i1 + j, ch2 + j, i2 + j);

讀取時也要加:

while(fscanf(fp, "%c %d %c %d\n",&ch11 , &i11 , &ch22 , &i22) == 4) 

(3)//fprintf 和 fscanf 聯合使用,fprintf寫入文本時加入\n,在fscanf讀取時也要加\n。

//單獨使用fscanf讀取多行數據時,可不加\n

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

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

相關文章

Python 中下劃線 “_” 的多面性:從變量到約定

# Python中下劃線“_”的多面性&#xff1a;從變量到約定 在Python的語法體系里&#xff0c;下劃線“_”看似毫不起眼&#xff0c;實則扮演著極為重要且多樣化的角色。它不僅能作為普通變量參與編程&#xff0c;更在多個特殊場景下有著獨特的用途與約定。深入理解下劃線的各種…

深入 Linux 聲卡驅動開發:核心問題與實戰解析

1. 字符設備驅動如何為聲卡提供操作接口&#xff1f; 問題背景 在 Linux 系統中&#xff0c;聲卡被抽象為字符設備。如何通過代碼讓應用程序能夠訪問聲卡的錄音和播放功能&#xff1f; 核心答案 1.1 字符設備驅動的核心結構 Linux 字符設備驅動通過 file_operations 結構體定…

基于Spring Boot的圖書管理系統的設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

記錄 macOS 上使用 Homebrew 安裝的軟件

Homebrew 是 macOS 上最受歡迎的軟件包管理器之一&#xff0c;能夠輕松安裝各種命令行工具和 GUI 應用。本文記錄了我通過 Homebrew 安裝的各種軟件&#xff0c;并對它們的用途和基本使用方法進行介紹。 &#x1f37a; Homebrew 介紹 Homebrew 是一個開源的包管理器&#xff…

個人AI助手的未來:Yi AI開源系統助力快速搭建

摘要 Yi AI推出了一站式個人AI助手平臺解決方案&#xff0c;助力用戶快速搭建專屬AI助手。該平臺采用全套開源系統&#xff0c;涵蓋前端應用、后臺管理及小程序功能&#xff0c;并基于MIT協議開放使用。同時&#xff0c;平臺集成了本地RAG方案&#xff0c;利用Milvus與Weaviate…

dpkg-architecture命令詳解

dpkg-architecture 是 Debian 系系統中用于處理軟件包架構相關操作的工具&#xff0c;尤其在軟件包構建和交叉編譯環境中至關重要。以下是其核心功能及用法的詳細說明&#xff1a; ?一、核心功能? ?架構查詢與驗證? 顯示或驗證當前系統&#xff08;DEB_HOST_ARCH&#xff…

STM32HAL庫,解決串口UART中斷接收到的第一個字節數據丟失

1.問題描述&#xff1a; 只有上電后第一次接收到的第一字節數據會丟失&#xff0c;往后再接收也不會存在問題了。 2.先貼出來重寫UART中斷回調函數 我在接收到第一字節數據后開啟定時器中斷的&#xff0c;做一個超時處理&#xff0c;每次接收到數據會對定時器計數值清零&…

解決 vxe-table 固定列對不齊,滾動后錯位、展開行遮擋的問題,解決渲染空白、邊框丟失問題

解決 vxe-table 固定列對不齊&#xff0c;滾動后錯位、展開行遮擋的問題&#xff0c;解決渲染空白、邊框丟失問題。 解決方法&#xff0c;更新到最新版本就完美解決了&#xff1b;v4 版本更新到 v4.12&#xff0c;v3版本更新到 v3.14 查看官網&#xff1a;https://vxetable.cn…

React相關面試題

以下是150道React面試題及其詳細回答&#xff0c;涵蓋了React的基礎知識、組件、狀態管理、路由、性能優化等多個方面&#xff0c;每道題目都盡量詳細且簡單易懂&#xff1a; React基礎概念類 1. 什么是React&#xff1f; React是一個用于構建用戶界面的JavaScript庫&#xff…

設備健康管理系統是什么,設備健康管理系統多少錢?

想象一下&#xff0c;你的汽車在儀表盤報警前 3 天&#xff0c;手機就收到 “發動機軸承剩余壽命 1500 公里” 的提醒 —— 這就是 ** 設備健康管理系統&#xff08;EHM&#xff09;** 的日常。在制造業&#xff0c;設備故障每年造成全球 3.4 萬億美元損失&#xff0c;而 80% 的…

Redis項目:秒殺業務

/*** 搶購秒殺券** param voucherId* return*/TransactionalOverridepublic Result seckillVoucher(Long voucherId) {// 1、查詢秒殺券SeckillVoucher voucher seckillVoucherService.getById(voucherId);// 2、判斷秒殺券是否合法if (voucher.getBeginTime().isAfter(LocalD…

區塊鏈(Blockchain)

區塊鏈&#xff08;Blockchain&#xff09;是一種去中心化、分布式的賬本技術&#xff0c;它通過密碼學保證數據的安全性和不可篡改性。它的核心特點包括去中心化、不可篡改性、可追溯性、智能合約等。 區塊鏈的關鍵概念 區塊&#xff08;Block&#xff09;&#xff1a;每個區…

和鯨科技受邀赴中國氣象局氣象干部培訓學院湖南分院開展 DeepSeek 趨勢下的人工智能技術應用專題培訓

為深入貫徹落實國家關于人工智能與氣象業務深度融合的戰略部署&#xff0c;提升在實際業務中應用人工智能技術解決問題的能力&#xff0c;推動氣象現代化高質量發展&#xff0c;中國氣象局氣象干部培訓學院湖南分院于 2025 年 3 月 14 日組織開展 “DeepSeek 等人工智能技術在氣…

Ubuntu 24 常用命令方法

文章目錄 環境說明1、賬號管理1.1、啟用 root 2、包管理工具 apt & dpkg2.1、apt 簡介 & 阿里源配置2.2、dpkg 簡介2.3、apt 和 dpkg 兩者之間的關系2.4、常用命令 3、啟用 ssh 服務4、防火墻5、開啟遠程登錄6、關閉交換分區7、build-essential&#xff08;編譯和開發軟…

OpenCV計算攝影學(22)將輸入的彩色圖像轉換為兩種風格的鉛筆素描效果函數pencilSketch()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 鉛筆風格非寫實線描圖。 該函數通過圖像處理技術將輸入的彩色圖像轉換為兩種風格的鉛筆素描效果&#xff1a; dst1&#xff1a;炭筆效果的灰度圖…

hackmyvm-Smol

信息收集 ┌──(root?kali)-[/home/kali] └─# arp-scan -I eth1 192.168.56.0/24 Interface: eth1, type: EN10MB, MAC: 00:0c:29:34:da:f5, IPv4: 192.168.56.103 WARNING: Cannot open MAC/Vendor file ieee-oui.txt: Permission denied WARNING: Cannot open MAC/Vendo…

使用DeepSeek和墨刀AI,寫PRD文檔、畫原型圖的思路、過程及方法

使用DeepSeek和墨刀AI&#xff0c;寫PRD文檔、畫原型圖的思路、過程及方法 現在PRD文檔要如何寫更高效、更清晰、更完整&#xff1f; 還是按以前的思路寫PRD&#xff0c;就還是以前的樣子。 現在AI這么強大&#xff0c;產品經理如何使用DeepSeek寫PRD文檔&#xff0c;產品經…

SpringData Redis緩存:自定義序列化與過期策略

文章目錄 引言一、Spring Cache與Redis集成基礎二、Redis緩存配置基礎三、自定義序列化策略四、實現自定義序列化器五、多級緩存配置六、自定義過期策略七、緩存注解的高級應用八、實現緩存預熱與更新策略九、緩存監控與統計總結 引言 在現代高并發分布式系統中&#xff0c;緩…

HOVER:人形機器人的多功能神經網絡全身控制器

編輯&#xff1a;陳萍萍的公主一點人工一點智能 HOVER&#xff1a;人形機器人的多功能神經網絡全身控制器HOVER通過策略蒸餾和統一命令空間設計&#xff0c;為人形機器人提供了通用、高效的全身控制框架。https://mp.weixin.qq.com/s/R1cw47I4BOi2UfF_m-KzWg 01 介紹 1.1 摘…

C++ :頂層const與底層const的區別

頂層const與底層const的區別 定義與核心區別 頂層 const (Top-level const)底層 const (Low-level const)?作用對象變量本身是常量&#xff08;不可修改&#xff09;變量指向或引用的對象是常量&#xff08;不可修改&#xff09;?典型場景指針本身不可變、普通變量為常量指…