Linux文件編程(標準C庫)

目錄

一、標準C庫打開/創建文件,讀寫文件,光標移動

二、標準C庫寫入結構體到文件

三、其他函數補充

1.fputc函數

2.feof函數和fgetc函數


前面講到的open函數都是基于linux內核的,也就是說在Windows系統上無法運行,移植性比較差,但標準C庫同樣有一套對文件進行操作的函數。

一、標準C庫打開/創建文件,讀寫文件,光標移動

打開文件函數:

#include <stdio.h>FILE *fopen(const char *path, const char *mode);

返回值為FILE類型的文件流,第一個參數是文件的路徑,第二個參數是用什么權限打開文件,權限如下:
?

寫入文件函數:

#include <stdio.h>size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

第一個參數是緩存區,第二個參數表示我們要寫入的每個數據的大小(例如要寫入一個字符串,那么size=sizeof(char),表示一個字符的大小),第三個參數是個數,第四個選擇哪個文件,傳入fopen函數的返回值即可

讀取文件函數:

#include <stdio.h>size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

參數含義和寫入文件的函數類似?

光標移動函數:

#include <stdio.h>int fseek(FILE *stream, long offset, int whence);

代碼示例:?

#include <stdio.h>
#include <string.h>int main()
{FILE *fp;//存儲fopen的返回值char *str = "Hello World!";char readBuf[128]={0};//存放讀取到的數據fp = fopen("./li.txt","w+");//因為第二個參數要傳入指針,所以用雙引號fwrite(str,sizeof(char),strlen(str),fp);fseek(fp,0,SEEK_SET);//光標復位fread(readBuf,sizeof(char),strlen(str),fp);printf("read data:%s\n",readBuf);return 0;
}

可以看到標準C庫的文件相關函數和Linux的函數是差不多的,標準C庫對不同文件的操作是獲取它的FILE類型的指針,而Linux是int類型的文件描述符,這些函數都可以類比Linux的函數來記憶。

運行結果:?


二、標準C庫寫入結構體到文件

代碼示例:

#include <stdio.h>
#include <string.h>struct Test{int a;char c;
};int main()
{FILE *fp;struct Test data={100,'a'};struct Test data2;fp = fopen("./file1","w+");int n_write = fwrite(&data,sizeof(struct Test),1,fp);	fseek(fp,0,SEEK_SET);int n_read = fread(&data2,sizeof(struct Test),1,fp);printf("read %d,%c\n",data2.a,data2.c);fclose(fp);return 0;
}

這里的代碼都可以類比我的上一篇文章Linux文件編程應用,只不過函數的參數和返回值不太相同,能看懂上一篇文章,那么這一篇就只是對C語言的鞏固,這里解釋一下fwrite函數和fread函數第二個和第三個參數的含義:拿上面代碼舉例,每次寫都寫入一個結構體類型的數據大小,用sizeof計算,第三個參數表示寫了幾次,這里寫一次就行了。
運行結果:


三、其他函數補充

1.fputc函數

#include <stdio.h>int fputc(int c, FILE *stream);

fputc函數可以寫入一個字符或整數到文件里,用fopen函數得到文件的返回值傳入fputc的第二個參數即可,要寫入多個數據用循環的方式寫入即可。?
代碼示例:

#include <stdio.h>
#include <string.h>int main()
{FILE *fp;char *str="Hello World!";int i;int len=strlen(str);fp=fopen("./file1","w+");for(i=0;i<len;i++){fputc(*str,fp);str++;}fclose(fp);return 0;
}

2.feof函數和fgetc函數

feof函數:

#include <stdio.h>int feof(FILE *stream);

fgetc函數:

#include <stdio.h>int fgetc(FILE *stream);

這兩個函數可以組合在一起用,見代碼示例:

#include <stdio.h>
#include <string.h>int main()
{FILE *fp;	char c;fp = fopen("./li.txt","r");while(!feof(fp))// nonezero if reach end of file{c = fgetc(fp);printf("%c",c);}fclose(fp);return 0;
}

我們先用只讀的方式打開li.txt文件,feof可以作為條件判斷,當讀到文件的尾部時,feof函數的返回值為0,在while循環里使用fgetc函數一個一個字符讀取fp所指向的文件。(至于為什么不會一直讀文件的同一個位置,應該就和這兩個函數有關)

以上就是Linux引入標準C庫對文件操作的函數,看了前面兩個文章,再看這篇會很好理解,用標準C庫來寫代碼無非就是移植性比較好,以后在Linux學習過程中,很多時候還是要用到Linux的函數。接下來我會更新Linux進程編程的學習筆記,希望大伙一起討論學習!

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

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

相關文章

使用simulink進行esp32開發,進行串口收發數據需要注意的地方,為什么收發不成功

1&#xff0c;主要是因為simulink里的配置文件配置的波特率和串口接受軟件配置的波特不一致導致的 2&#xff0c;主要有以下三個界面 a.配置文件 b.模型 模型直接選擇使用的是那組串口就行了&#xff0c;一般情況下我們收發使用同一組就可以&#xff0c;這樣收發模塊填寫的端…

20240711編譯友善之臂的NanoPC-T6開發板的Buildroot

20240711編譯友善之臂的NanoPC-T6開發板的Buildroot 2024/7/11 21:02 百度&#xff1a;nanopc t6 wiki https://wiki.friendlyelec.com/wiki/index.php/NanoPC-T6/zh NanoPC-T6/zh 4.4 安裝系統 4.4.1 下載固件 4.4.1.1 官方固件 訪問此處的下載地址下載固件文件 (位于網盤的&q…

社交媒體中智能品牌視覺識別系統的設計與應用

社交媒體中智能品牌視覺識別系統的設計與應用開題報告與任務書分析 一、引言 隨著社交媒體的蓬勃發展,品牌與消費者之間的互動日益頻繁,品牌視覺識別系統作為品牌傳播的重要載體,其設計與應用顯得尤為重要。特別是在智能技術的推動下,如何設計并應用智能品牌視覺識別系統…

【Python】已解決:ModuleNotFoundError: No module named ‘sklearn.cross_validation

文章目錄 一、問題背景二、可能出錯的原因三、錯誤代碼示例四、正確代碼示例五、注意事項 &#xff08;機器學習分割數據問題&#xff09;解決“ModuleNotFoundError: No module named ‘sklearn.cross_validation’” 一、問題背景 在機器學習的實踐中&#xff0c;數據分割是…

CSS技巧專欄:一日一例 4.純CSS實現兩款流光溢彩的酷炫按鈕特效

大家好&#xff0c;今天是 CSS技巧專欄&#xff1a;一日一例 第三篇《純CSS實現兩款流光溢彩的酷炫按鈕特效》 先看圖&#xff1a; 特此說明&#xff1a; 本專題專注于講解如何使用CSS制作按鈕特效。前置的準備工作和按鈕的基本樣式&#xff0c;都在本專欄第一篇文章中又詳細…

Python基礎教學之四:面向對象編程——邁向更高級編程

Python基礎教學之四&#xff1a;面向對象編程——邁向更高級編程 一、面向對象編程概念 1. 類和對象 定義&#xff1a;在面向對象編程(OOP)中&#xff0c;類是創建對象的模板&#xff0c;它定義了對象的屬性和方法。對象是類的實例&#xff0c;具體存在的實體&#xff0c;擁有…

socket編程(1)

socket編程 1. 預備知識點1.1 網絡字節序1.2 ip地址轉換函數1.3 sockaddr數據結構 最后 1. 預備知識點 1.1 網絡字節序 多字節數據有大端和小端之分&#xff0c;網絡數據流采用大端字節序&#xff0c;如果主機采用的是小端字節序&#xff0c;那么需要轉換。 大端&#xff1a…

ffmpeg和imagemagick制作gif動圖

from: https://blog.csdn.net/hufang360/article/details/107291163?ops_request_misc%257B%2522request%255Fid%2522%253A%2522167876076516800186587476%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id167876076516800186587476&biz_i…

【JavaScript 報錯】未捕獲的范圍錯誤:Uncaught RangeError

&#x1f525; 個人主頁&#xff1a;空白詩 文章目錄 一、錯誤原因分析1. 遞歸調用次數過多2. 數組長度超出限制3. 數值超出允許范圍 二、解決方案1. 限制遞歸深度2. 控制數組長度3. 檢查數值范圍 三、實例講解四、總結 Uncaught RangeError 是JavaScript中常見的一種錯誤&…

347. 前 K 個高頻元素(中等)

347. 前 K 個高頻元素 1. 題目描述2.詳細題解3.代碼實現3.1 Python3.2 Java 1. 題目描述 題目中轉&#xff1a;347. 前 K 個高頻元素 2.詳細題解 尋找出現頻率前 k k k高的元素&#xff0c;因此需要先統計各個元素出現的次數&#xff0c;該步驟時間復雜度為 O ( n ) O(n) O(n)…

柔性接觸力學及其建模仿真方法

柔性接觸力學是研究柔性體&#xff08;如柔性機器人、柔性結構等&#xff09;在接觸過程中產生的力學效應和相互作用的學科。它涉及到接觸力的計算、接觸變形的分析以及接觸過程中的能量轉換等多個方面。由于柔性體具有變形能力&#xff0c;其接觸過程往往比剛性體接觸更為復雜…

Transformer學習過程中常見的問題與解決方案 - Transformer教程

在機器學習領域&#xff0c;Transformer模型已經成為了處理自然語言處理&#xff08;NLP&#xff09;任務的主流工具。然而&#xff0c;在學習和使用Transformer的過程中&#xff0c;很多人會遇到各種各樣的問題。今天我們就來聊一聊Transformer學習過程中常見的問題以及對應的…

C++模板總結

文章目錄 寫在前面1. 函數模板1.1 函數模板的概念1.2 函數模板的原理1.3 函數模板的實例化1.4 函數模板的實例化模板參數的匹配原則 2. 類模板3. 非類型模板參數4. 模板的特化4.1 概念4.2 函數模板特化4.3 類模板特化 5. 模板分離編譯6. 總結 寫在前面 進入C以后&#xff0c;C…

智能小車——初步想法

需要參考輪趣的智能小車自己搭建一臺智能機器人&#xff0c;這里從底層控制開始逐步搭建。 控制模式 之后要自行搭建智能小車&#xff0c;所以將輪趣的底盤代碼進行學習&#xff0c;根據開發手冊先大致過一遍需要的內容。 有做很多個控制方法&#xff0c;包括了手柄、串口、…

MySQL中的JOIN、LEFT JOIN、RIGHT JOIN講解

在 MySQL 中&#xff0c;JOIN 是一種非常強大的功能&#xff0c;它允許你將兩個或多個表中的行結合起來&#xff0c;基于兩個表之間的共同字段。這種操作在數據庫查詢中非常常見&#xff0c;特別是在處理關系型數據庫時。下面我將分別解釋 JOIN、LEFT JOIN&#xff08;也稱為 L…

uin-app微信小程序自定義tabBar底部菜單實現簡單示例(工作筆記)

在微信小程序中實現自定義 tabBar 可以為你的應用提供更加靈活和個性化的底部導航菜單。由于微信小程序的官方 tabBar 配置功能有限&#xff0c;自定義 tabBar 成為了很多開發者實現復雜底部導航的選擇。以下是一個簡單的示例&#xff0c;說明如何在小程序中實現自定義 tabBar。…

Linux下常見壓縮文件tar.xz、tar.bz2、tar.gz的區別和詳解

文章目錄 tar.xz tar.bz2 tar.gz 的區別三種文件的解壓方式tar.xz的解壓三種壓縮文件的創建方式 tar.xz tar.bz2 tar.gz 的區別 這三個文件擴展名都表示壓縮后的檔案文件&#xff0c;但它們使用不同的壓縮算法。 tar.xz: tar 代表 Tape Archive&#xff0c;它是一種將多個文件…

House holder reflections and Givens rotations

House holder reflections and Givens rotations Householder反射和Givens旋轉是兩種常見的線性代數方法&#xff0c;用于將一個矩陣分解為正交矩陣(Q)和上三角矩陣&#xff0c;即QR分解。它們在數值線性代數中非常重要&#xff0c;特別是在求解線性方程組和特征值問題中。以下…

【若依管理系統】注意事項

1.前端字段必填 rules: {sceneName: [{ required: true, message: "場景名稱不能為空", trigger: "blur" }],orderNum: [{ required: true, message: "顯示排序不能為空", trigger: "blur" }], }, 2.IDEA&#xff0c;默認以debug模式…

python | pyvips,一個神奇的 Python 庫

本文來源公眾號“python”&#xff0c;僅用于學術分享&#xff0c;侵權刪&#xff0c;干貨滿滿。 原文鏈接&#xff1a;pyvips&#xff0c;一個神奇的 Python 庫&#xff01; 大家好&#xff0c;今天為大家分享一個神奇的 Python 庫 - pyvips。 Github地址&#xff1a;https…