Linux學習-應用軟件編程(fread/fwrite,流定義相關接口)

fread

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); ?

功能

按塊從文件讀取數據,從文件中讀 nmemb ?個、每個 size ?字節的元素,存入 ptr ?指向的內存。

參數

-? ptr?:存儲讀取數據的內存首地址(需提前分配足夠空間,如定義數組、用 ?malloc??申請堆內存 )。
- ?size?:單個元素的字節數(同 ?fwrite?,需和寫入時的 ?size??一致,否則數據會錯位 )。
- ?nmemb?:希望讀取的元素個數(嘗試讀 ?size * nmemb??字節,實際讀多少看文件內容 )。
- ?stream?:文件流指針(通過 ?fopen??打開,需以可讀模式如 ??"r+"??等打開 )。

返回值

- 成功:返回實際讀到的元素個數(等于 ?nmemb??表示讀滿;若文件末尾不夠 ?nmemb??個元素,返回實際讀到的數量 )。
- 文件末尾:返回 ?0?(可用來判斷是否讀完文件 )。

#include<stdio.h>
struct stu
{int id;char name[100];int score;
};
int main(int argc,const char*argv[])
{FILE*fp = fopen("./1.txt","r");if(NULL == fp){printf("fopen error\n");return -1;}struct stu s;struct stu ss[10];size_t cnt = fread(&s,sizeof(struct stu),1,fp);printf("cnt = %ld\n",cnt);printf("%d %s %d\n",s.id,s.name,s.score);cnt = fread(ss,sizeof(struct stu),10,fp);printf("cnt = %ld\n",cnt);for(int i = 0;i < cnt;i++){printf("%d %s %d\n",ss[i].id,ss[i].name,ss[i].score);}fclose(fp);
}

fwrite

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); ?

功能

按塊向文件寫入數據,把 ptr ?指向的內存數據,以「 size ?字節/元素 、共 nmemb ?個元素」的形式寫入文件。

參數

- ?ptr?:要寫入數據的內存首地址(常搭配數組、結構體等,傳遞 ?&變量??或數組名)。
- ?size?:單個元素的字節數(如 ?sizeof(int)??表示 int 類型占 4 字節)。
- ?nmemb?:要寫入的元素個數(需和 ?size??匹配,總寫入字節 = ?size * nmemb??)。
- ?stream?:文件流指針(通過 ?fopen??打開文件獲得,需確保以可寫模式如 ?"wb"??、?"a+"??等打開 )。

返回值

- 成功:返回實際寫入的元素個數(正常應等于 ?nmemb?;若磁盤滿、權限不足等,可能小于)。

#include<stdio.h>struct stu
{int id;char name[100];int score;
};
int main(int argc,const char*argv[])
{FILE*fp = fopen("./1.txt","w");if(NULL == fp){printf("fopen error\n");return -1;}struct stu ss[5] = {{1,"zahngsan",99},{2,"lisi",90},{3,"wangwu",98},{4,"maliu",67},{5,"wanger",100}};size_t cnt = fwrite(ss,sizeof(struct stu),5,fp);printf("cnt = %ld\n",cnt);fclose(fp);
}

bmp

#pragma pack(1)//bmp文件相關信息
typedef struct tagBITMAPFILEHEADER {short    bfType;         // 文件類型標志int      bfSize;         // 文件大小,單位為字節short    bfReserved1;    // 保留字節short    bfReserved2;    // 保留字節int      bfOffBits;      // 數據偏移量,即實際圖像數據開始的位置
}Bmp_file_head_t;
//bmp圖像信息
typedef struct tagBITMAPINFOHEADER {int   biSize;         // BITMAPINFOHEADER的大小,單位為字節int    biWidth;        // 位圖的寬度,單位為像素int    biHeight;       // 位圖的高度,單位為像素short    biPlanes;       // 目標設備的位平面數,必須為1short    biBitCount;     // 每像素位數(顏色深度)int   biCompression;  // 圖像壓縮類型int   biSizeImage;    // 圖像大小,單位為字節int    biXPelsPerMeter;// 水平分辨率,單位為像素/米int    biYPelsPerMeter;// 垂直分辨率,單位為像素/米int   biClrUsed;      // 實際使用顏色數int   biClrImportant; // 重要顏色數
}Bmp_info_t;
#pragma pack()int get_bmp_head_info(const char *bmpname, Bmp_file_head_t *pheadinfo, Bmp_info_t *pbmpinfo)
{FILE *fp = fopen(bmpname, "r");if (NULL == fp){printf("fopen error\n");return -1;}fread(pheadinfo, sizeof(Bmp_file_head_t), 1, fp);fread(pbmpinfo, sizeof(Bmp_info_t), 1, fp);fclose(fp);return 0;
}int main(int argc, const char *argv[])
{Bmp_file_head_t headinfo;Bmp_info_t bmpinfo;get_bmp_head_info("./3.bmp", &headinfo, &bmpinfo);printf("sizeof(Bmp_file_head_t) = %ld\n", sizeof(Bmp_file_head_t));printf("sizeof(Bmp_info_t) = %ld\n", sizeof(Bmp_info_t));printf("biWidth = %d, biHeight = %d, biBitCount = %d\n", bmpinfo.biWidth, bmpinfo.biHeight, bmpinfo.biBitCount);return 0;
}

?流定位相關接口

fseek

int fseek(FILE *stream, long offset, int whence);

功能

實現文件流的重新定位,用于調整文件內部指針的位置,決定后續讀寫操作從文件的哪個位置開始。

參數

- ?stream?:需要進行定位操作的文件流指針,由 ?fopen??等函數打開文件后獲得。
- ?offset?:偏移量,用于指定相對于 ?whence??位置移動的字節數,可正(向后移動 ?)、可負(向前移動 ?,但需注意不能越界 )。
- ?whence?:定位的相對基準位置,有以下宏定義可選:
- ?SEEK_SET?:以文件開頭為基準進行偏移,?offset??為相對于文件開頭的偏移字節數。
- ?SEEK_CUR?:以文件當前讀寫位置為基準進行偏移,?offset??是相對于當前位置的偏移量。
- ?SEEK_END?:以文件末尾為基準進行偏移,?offset??常搭配負數,實現從末尾往前定位(如 ?fseek(stream, -10, SEEK_END)??表示定位到文件末尾向前 10 字節處 )。

返回值

- 成功:返回 當前偏移量。
- 失敗:返回 -1 ,常見失敗情況如偏移量導致越界(如 ?SEEK_SET??時 ?offset??為負數 )、文件流異常等。

rewind(fp) ==>fseek(fp,0,SEEK_SET)

ftell

long ftell(FILE *stream);

功能

獲取文件流當前位置到文件開頭的偏移量,即返回當前文件指針距離文件起始位置的字節數,可用于判斷文件大小、輔助 fseek ?定位等場景。

返回值

偏移量:byte

練習

#include<stdio.h>
#include<stdlib.h>
struct stu
{int id;char name[100];int score;
};
int main(int argc,const char*argv[])
{FILE*fp = fopen("./1.txt","w+");if(NULL == fp){printf("fopen error\n");return -1;}struct stu ss[5] = {{1,"zahngsan",99},{2,"lisi",90},{3,"wangwu",98},{4,"maliu",67},{5,"wanger",100}};fwrite(ss,sizeof(struct stu),5,fp);fseek(fp,0,SEEK_END);long len = ftell(fp);rewind(fp);FILE*fp1 = fopen("./2.txt","w");if(NULL == fp1){printf("fopen error\n");return -1;}//空洞文件fseek(fp1,len - 1,SEEK_SET);int ret = fputc('\0',fp1);if(EOF == ret){printf("磁盤空間不足\n");return -1;}fseek(fp1,0,SEEK_SET);char *buff = malloc(len);fread(buff,1,len,fp);fwrite(buff,1,len,fp1);free(buff);fclose(fp);fclose(fp1);
}

strtok

char *strtok(char *str, const char *delim); ?

功能

按分隔符截取字符串,從 ?str??中逐個提取由 ?delim??分隔的子串。首次調用需傳入待分割的完整字符串 ?str?,后續調用傳入 ?NULL??即可繼續分割剩余部分(內部會維護靜態指針記錄位置 )。

參數

- ?str?:
- 首次調用:傳入待分割的原始字符串(會被函數修改,分割后原字符串會被分隔符替換為 ?\0??,用于標記子串結束 )。
- 后續調用:傳入 ?NULL??,函數會基于內部靜態指針,繼續分割剩余未處理的部分。
- ?delim?:
傳入分隔符字符串(如 ?",-"??表示逗號、減號都可作為分隔符 ),只要遇到 ?delim??中任意字符,就會停止當前子串截取。

返回值

- 成功:返回當前截取到的子串首地址(如分割 ?"a,b,c"??,首次返回 ?"a"??的地址,后續依次返回 ?"b"?、?"c"??)。
- 失敗/結束:返回 ?NULL?(當沒有可分割的子串時觸發 )。

練習

實現一個單詞查詢軟件: 用戶從終端輸入一個單詞,查找該單詞的意思并打印; 若用戶輸入".quit",則退出該軟件。

#include<stdio.h>
#include <string.h>
int main(int argc,const char*argv[])
{FILE*fp = fopen("./dict.txt","r");if(NULL == fp){printf("fopen error\n");return -1;}rewind(fp);char s[1024];printf("輸入單詞\n");scanf("%s",s);char buff[1024] = {0};if(0 == strcmp(".quit",s)){return 0;    }char *p = fgets(buff,sizeof(buff),fp);while(p != NULL){char *b = strtok(buff," ");if(0 == strcmp(b,s)){b = strtok(NULL,"\r");printf("%s%s\n",s,b);break;}p = fgets(buff,sizeof(buff),fp);}if(p == NULL){printf("not find\n");return 0;}fclose(fp);}



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

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

相關文章

IP分片(IP Fragmentation)

目錄 一、核心概念:MTU與分片的必要性 二、IP分片的關鍵字段(IPv4頭部) 三、分片與重組流程 1. 分片過程(發送端或中間路由器) 2. 重組過程(接收端) 四、IPv4與IPv6分片的差異 五、分片的潛在問題與風險 六、總結 一、傳輸效率降低,帶寬開銷增加 二、可靠性降低,數據丟…

高并發內存池 內存釋放回收(6)

文章目錄前言一、threadcache回收內存二、centralcache回收內存三、pagecache回收內存總結前言 Hello&#xff0c;我們繼續乘勝追擊 ??本篇難度較大&#xff0c;大家要好好學一下 一、threadcache回收內存 當某個線程申請的對象不用了&#xff0c;可以將其釋放給 thread cac…

2438. 二的冪數組中查詢范圍內的乘積

2438. 二的冪數組中查詢范圍內的乘積 初始理解題目 首先&#xff0c;我們需要清楚地理解題目在說什么。題目給出一個正整數 n&#xff0c;要求我們構造一個數組 powers&#xff0c;這個數組滿足以下條件&#xff1a; 元素性質?&#xff1a;數組中的每個元素都是 2 的冪。即…

【PyTorch學習筆記 - 01】 Tensors(張量)

最近項目需要優化一下目標檢測網絡&#xff0c;在這個過程中發現還是得增加對框架底層的掌握才可行。于是準備對pytorch的一些基本概念做一些再理解。參考PyTorch的wiki&#xff0c;對自己的學習過程做個記錄。 Tensors 是一種特殊的數據結構&#xff0c;與數組和矩陣非常相似…

【C/C++】(struct test*)0->b 講解

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 一、什么是結構體成員的偏移量&#xff1f; 二、為什么需要計算偏移量&#xff1f; 三、如何計算偏移量&#xff1f; 四、總結 一、什么是結構體成員的偏移量&#…

使用Pytest進行接口自動化測試(三)

&#xff08;一&#xff09;YAML 之前在項目中&#xff0c;我們也是用過YAML來做配置文件&#xff0c;他用于以人類可讀的形式存儲信息&#xff0c; 特點: 一種簡易的可讀語言&#xff0c;用于人和計算機交換數據 通常用來存儲配置信息 跟python類似&…

算法訓練營day46 647. 回文子串、516.最長回文子序列、動態規劃總結篇

今天是動態規劃的最后一篇內容了&#xff0c;本篇主要是針對回文字符串這種“與眾不同”的遞推規律來進行講解 647. 回文子串 統計并返回這個字符串中 回文子串 的數目 暴力解法 兩層for循環&#xff0c;遍歷區間起始位置和終止位置&#xff0c;然后還需要一層遍歷判斷這個區…

Qt界面優化

1.QSS在網頁前端開發領域中&#xff0c;CSS 是一個至關重要的部分&#xff0c;描述了一個網頁的 “樣式”&#xff0c;從而起到對網頁美化的作用。所謂樣式&#xff0c;包括不限于大小、位置、顏色、背景、間距、字體等等。網頁開發作為 GUI 的典型代表&#xff0c;也對于其他客…

week1+2+3

408 計組 1.基本組成2.數據的表示和運算定點數&#xff1a;把數字分為定點整數和定點小數分開存儲 浮點數&#xff1a;用科學計數法存儲 原碼 -全部取反-> 反碼 反碼 1->補碼 補碼 -符號位取反->移碼帶余除法&#xff1a;設x,m∈Z&#xff0c;m>0則存在唯一的整數q…

java8中javafx包缺少報錯

今天拉取一個jdk1.8的項目里面有一個代碼用到了javafx&#xff0c;這個我記得是jdk中的包&#xff0c;正常不應該報錯的。然后發現jdk中還真沒有&#xff0c;查了一下是因為版本問題。 Java 8 及之前&#xff1a;Oracle JDK 自帶 JavaFX&#xff0c;OpenJDK 通常不包含Java 9 …

day072-代碼檢查工具-Sonar與maven私服-Nexus

文章目錄0. 老男孩思想-選對池塘釣美人魚1. 代碼回滾方案2. SonarQube2.1 代碼檢查工具2.2 部署sonarqube2.2.1 軟件要求2.2.2 安裝軟件2.2.3 啟動sonar2.2.4 部署插件2.3 sonar檢查java代碼2.3.1 創建sona項目2.3.2 分析java代碼2.3.3 Jenkins結合sonar檢查代碼2.4 sonar檢查非…

【前端基礎】15、列表元素、表格元素、表單元素(注:極其粗略的記載。)

一、列表元素 1、什么是列表元素2、有序列表&#xff08;ol、li&#xff09; ol有序列表 直接子元素只能是li。 li列表中的每一項。3、無序列表&#xff08;ul、li&#xff09; ol無序列表 直接子元素只能是li。 li列表中的每一項。4、定義列表&#xff08;dl、dt、dd&#xff…

IRFBG30PBF Vishay威世MOSFET場效應管

IRFBG30PBF Vishay威世&#xff1a;超快MOSFET 場效應管一、產品定位IRFBG30PBF 是Vishay威世推出的600V/30A N溝道功率MOSFET&#xff0c;采用第五代TrenchFET技術&#xff0c;專為開關電源、電機驅動、新能源逆變器等高功率場景設計。以85mΩ超低導通電阻和超快反向恢復&…

【07-AGI的討論】

AI ANI&#xff1a;artificial narrow intelligence; 如 智能音箱&#xff1b;自動駕駛汽車&#xff0c;網絡搜索&#xff0c;其他用于專業特定事項的工具&#xff1b; AGI&#xff1a;artificial general intelligence; building AI systems that could do anything a typical…

[激光原理與應用-225]:機械 - 3D圖與2D圖各自的作用

在機械設計與加工領域&#xff0c;3D圖和2D圖是兩種核心的工程表達方式&#xff0c;它們在產品設計、制造、裝配及維護等環節中扮演不同角色&#xff0c;具有互補性。以下是它們各自的作用及具體應用場景的詳細解析&#xff1a;一、3D圖的作用1. 直觀展示產品全貌三維可視化&am…

【從零開始java學習|第一篇】java中的名詞概念(JDK、JVM、JRE等等)

目錄 一、核心運行環境三要素&#xff08;JVM/JRE/JDK&#xff09; 二、常用開發指令&#xff08;JDK 自帶工具&#xff09; 三、一些其他概念 四、總結核心邏輯鏈 要入門 Java&#xff0c;理解核心概念之間的關系是基礎。以下是 Java 中最核心的基礎概念、工具及相關名詞的…

UVa12345 Dynamic len(set(a[L:R]))

[TOC](UVa12345 Dynamic len(set(a[L:R]))) 題目鏈接 UVA - 12345 Dynamic len(set(a[L:R])) 題意 有編號從 0 到 n?1 的 n 個數&#xff0c;有兩種操作&#xff1a; Q L R 詢問編號 L 到編號 R?1 的數中有多少個不同的數字。M X Y 將編號為 X 的數字改為 Y。 你的任務就是…

[Ubuntu] VNC連接Linux云服務器 | 實現GNOME圖形化

將桌面環境修改為 GNOME 并通過 VNC 遠程訪問的步驟 & TightVNC 的安裝與配置說明&#xff1a;1. 安裝 GNOME 桌面環境 sudo apt update sudo apt install ubuntu-gnome-desktop -y2. 安裝 TightVNC 服務器 sudo apt install tightvncserver -y3. 初始化 VNC Server 并設置…

進程、網絡通信方法

一、進程間通信(IPC)方法 適用于同一臺主機上的進程間數據交換。 管道(Pipe) 匿名管道:單向通信,僅用于父子進程。 命名管道(FIFO):通過文件系統路徑訪問,支持無親緣關系進程。 消息隊列(Message Queue) 結構化消息(類型+數據),按類型讀取,支持異步通信。…

[激光原理與應用-241]:設計 - 266n皮秒深紫外激光器,哪些因素影響激光器紫外光的輸出功率?

一、短期穩定性266nm皮秒深紫外激光器紫外光輸出功率的穩定性受非線性晶體性能、光學系統設計、熱管理效果、重復頻率與脈沖能量匹配度、環境干擾控制等因素影響&#xff0c;具體分析如下&#xff1a;1. 非線性晶體性能晶體選擇與狀態&#xff1a;BBO&#xff08;偏硼酸鋇&…