學習嵌入式第二十六天

文章目錄

  • IO(續上)
    • 1.標準IO
      • 1.標準IO的接口
      • 2.流的定位
    • 2.文件IO
      • 1.概念:
      • 2.系統調用和庫函數
      • 3.文件IO函數接口
  • 習題

IO(續上)

1.標準IO

1.標準IO的接口

  • fwrite

    原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
    功能:向流中寫入ptr指向的nmemb個對象,每個對象size個字節
    參數:ptr:指向數據空間的首地址size:寫入的每個對象的大小nmemb:寫入對象的個數stream:文件流指針
    返回值:成功返回實際寫入對象的個數失敗返回0
    
  • fread

    原型: size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    功能:從流中讀取nmemb個對象到ptr指向的空間中,每個對象size字節
    參數:ptr:存放數據空間的首地址size:讀取對象的字節大小nmemb:讀取對象的個數stream:文件流指針
    返回值:成功返回讀到對象的個數失敗或者讀到文件末尾返回0
    

2.流的定位

  • 作用:設置流的偏移量

  • 偏移量的設置:

    1. fseek

      原型:int fseek(FILE *stream,long offset,int whence);
      功能:設置流的偏移量的標識
      參數:stream:文件流指針offset:偏移量>0 向后偏移<0 向前偏移whence:標識SEEK_SET:文件開頭SEEK_CUR:當前位置SEEK_END:文件末尾
      返回值:成功返回0失敗返回-1
      
    2. ftell

      原型:long ftell(FILE *stream);
      功能:獲得流的偏移量
      參數:stream:文件流指針
      返回值:成功返回流的偏移量
      
    3. rewind

      原型:void rewind(FILE *stream);
      功能:將流重新定位到開頭
      

    練習1:從終端輸入一個文件名,獲得文件的長度

    #include<stdio.h>int main(void){FILE *fp = NULL;long len = 0;char filename[32] = {0};int cnt = 0;scanf("%s",filename);fp = fopen(filename,"r");if(NULL == fp){perror("fail to fopen");return -1;}fseek(fp,0,SEEK_END);len = ftell(fp);printf("len = %ld\n",len);return 0;
    }
    

    練習2:從bmp文件中讀取圖片的寬度和高度

    #include<stdio.h>int main(void){FILE *fp = NULL;int width = 0;int height = 0;fp = fopen("1.bmp","r");if(NULL == fp){perror("fail to fopen");return -1;}fseek(fp,18,SEEK_SET);fread(&width, 4, 1, fp);fread(&height, 4, 1, fp);printf("width = %d, height = %d\n", width, height);fclose(fp);return 0;}
    

2.文件IO

1.概念:

  • 標準IO是有緩存的IO,文件IO沒有緩存,適合于通信,硬件設備操作
  • 標準IO是庫函數,文件IO是系統調用

2.系統調用和庫函數

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

3.文件IO函數接口

  1. 函數接口

    標準IO						    文件IO
    fopen							 open
    fclose							 close
    fgetc/fputc						 read/write
    fgets/fputs					 	 
    fscanf/fprintf					 
    fread/fwrite					 
    fseek/ftell/rewind				 lseek
    
  2. 文件打開

    原型:
    功能:打開文件獲得操作文件的文件描述符
    參數:pathname:要打開的文件路徑flags:打開文件的標志,必須包含三者之一O_RDONLYO_WRONLYO_RDWRO_CREAT		文件不存在創建O_TRUNC		文件存在截斷為0O_APPEND	追加O_EXCL		文件存在報錯
    返回值:成功返回新文件描述符失敗返回-1
    
    • 有三個特殊的文件描述符:標準輸入(0),標準輸出(1),標準錯誤(2)
    • 文件描述符特點
      • 取未被占用的最小的非負整數
      • 文件描述符有上限,到達上限后再打開會報錯誤
  3. 關閉文件描述符

    原型:int close(int fd);
    功能:
    關閉文件描述符
    
  4. 標準IO對應文件IO的打開方式

標準IO文件IO
rO_RDONLY
r+O_RDWR
wO_WRONLY |O_CREAT |O_TRUNC , 0664
w+O_RDWR | O_CREAT | O_TRUNC , 0664
aO_WRONLY |O_APPEND | O_CREAT , 0664
a+O_RDWR | O_APPEND | O_CREAT , 0664
  1. 文件IO讀寫

    • write

      原型:ssize_t write(int fd, const void *buf, size_t count);
      功能:
      向文件描述符中寫入buf指向的count個字節的數據
      參數:
      fd:文件描述符
      buf:要寫入的數據空間首地址
      count:要寫入的字節數
      返回值:
      成功返回實際寫入的字節數
      失敗返回-1
      

習題

1.利用fread和fwrite實現圖片的拷貝

代碼實現:

#include<stdio.h>int main(void){FILE *fp = NULL;FILE *fp1 = NULL;char filename[100];char filename1[100];char tmpbuff[4096] = {0};size_t nret = 0;printf("請輸入源圖片名:");scanf("%s",filename);fp = fopen(filename,"r");if(fp == NULL){perror("fail to fopen");return -1;}printf("請輸入目標圖片名:");scanf("%s",filename1);fp1 = fopen(filename1,"w");if(fp1 == NULL){perror("fail to fopen");return -1;}while(1){nret = fread(tmpbuff, 1, sizeof(tmpbuff), fp);if(nret == 0){break;}fwrite(tmpbuff,1,nret,fp1);}fclose(fp);fclose(fp1);return 0;
}

2.統計一個文件中出現最多字符是哪個,并顯示出現了多少次

代碼實現:

#include<stdio.h>
#include<stdlib.h>typedef struct linknode{char data;int count;struct linknode *next;
} node;int main(){FILE *fp = NULL;char filename[100] = {0};char ch;node *head = NULL;node *current = NULL;node *tmp = NULL;int max = 0;printf("請輸入要掃描的文件:");scanf("%s", filename);fp = fopen(filename,"r");if(fp == NULL){printf("無法打開文件!\n");return 1;}while(1){ch = fgetc(fp);if(ch == EOF) {break;}current = head;while(current != NULL){if(current->data == ch){current->count++;break;}current = current->next;}if(current == NULL){tmp = malloc(sizeof(node));if(tmp == NULL){perror("fail to malloc");return -1;}tmp->data = ch;tmp->count = 1;tmp->next = head;head = tmp;}}current = head;while(current != NULL){if(current->count > max){max = current->count;tmp = current;}current = current->next;}printf("出現次數最多的字符為:%c\n出現了%d次\n",tmp->data,tmp->count);while(head != NULL){tmp = head;head = head->next;free(tmp);}fclose(fp);return 0;
}

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

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

相關文章

GDB 程序啟動參數設置深度指南

GDB 程序啟動參數設置深度指南 1. 概述 在程序調試過程中&#xff0c;正確設置啟動參數對于驗證程序行為、重現特定場景至關重要。GDB提供多種靈活的方式設置啟動參數&#xff0c;特別是當您需要調試命令行參數處理邏輯或配置敏感型應用時。 2. 參數設置的核心方法 2.1 啟動GDB…

Autudl華為昇騰系列NPU簡介和部署推理yolo11 yolov8 yolov5分割模型

0.配置Autudl 下面圖片是我所租的昇騰卡和具體環境版本&#xff0c;太具體的就不說了&#xff0c;有需要的話我單獨出一期Autudl租顯卡的教程&#xff0c;主要是為了學習昇騰環境如何運行Yolo系列模型。 0.1華為昇騰芯片&#xff08;Ascend&#xff09;簡介 1.Ascend 310&…

什么是JSP和Servlet以及二者的關系

JSP&#xff08;JavaServer Pages&#xff09; 是“HTML 里寫 Java”的模板技術&#xff0c;最終會被容器轉換成 Servlet。Servlet 是“Java 里寫 HTML”的 Java 類&#xff0c;直接繼承 javax.servlet.http.HttpServlet&#xff0c;用來接收/響應 HTTP 請求。Servlet 是什么 純…

【WonderTrader源碼詳解 1】【環境搭建 2】【編譯安裝WonderTrader】

一、引言 本篇來講述如何搭建 wondertrader 和 wtpy 二、wondertrader 2.1 源碼下載 # /home/leo/sda_1.6TBgit clone https://gitee.com/wondertrader/wondertrader.gitgit clone https://gitee.com/wondertrader/wtpy.git2.2 源碼編譯 cd /home/leo/sda_1.6TB/wondertrader/s…

hutool 作為http 客戶端工具調用的一點點總結

場景一&#xff1a;客戶端timeout 的時間給的很短//100毫秒 private static final int HTTP_TIMEOUT_MS 1 * 100; response HttpUtil.createPost(patrolresultconfirmUrl).body(JSONObject.toJSONString(search)).header("Authorization", token).timeout(HTTP_TI…

基于MongoDB/HBase的知識共享平臺的設計與實現

標題:基于MongoDB/HBase的知識共享平臺的設計與實現內容:1.摘要 在當今信息爆炸的時代&#xff0c;知識的有效共享和管理變得愈發重要。本研究的目的是設計并實現一個基于MongoDB/HBase的知識共享平臺&#xff0c;以滿足大規模知識數據的存儲、高效查詢和快速共享需求。方法上&…

PHP數組操作:交集、并集和差集

1. 交集&#xff08;Intersection&#xff09;交集是指兩個集合中都存在的元素。$array1 [1, 2, 3, 4]; $array2 [3, 4, 5, 6];$intersection array_intersect($array1, $array2); print_r($intersection); // 輸出: Array ( [2] > 3 [3] > 4 )2. 并集&#xff08;Uni…

Qt 常用控件 - 7

Text Edit&#xff08;多行輸入框&#xff09;QTextEdit 表示多行輸入框&#xff0c;也是一個富文本 & markdown 編輯器&#xff0c;能在內容超出范圍時自動提供滾動條。QTextEdit&#xff1a;不僅僅能表示純文本&#xff0c;還可以表示 htnl 和 markdownQPlainTextEdit&am…

JDK、eclipse的安裝,配置JDK、Tomcat并使用eclipse創建項目

目錄一、JDK的安裝1. 安裝JDK2. 配置環境變量3. 檢查jdk是否已安裝二、eclipse的安裝1. 解壓安裝2. 設置字體大小3. 設置拼寫提示三、tomcat安裝四、創建項目1. 第一次創建一個普通的java項目2. 第一次創建一個java web項目擴展&#xff1a;運行項目報Tomcat端口占用&#xff0…

Iptables 詳細使用指南

目錄 1. 工作原理? 2. 核心架構&#xff08;四表五鏈&#xff09; 2.1 四張表&#xff08;優先級從高到低&#xff09; 2.2 五條內置鏈&#xff08;數據包流向&#xff09; 3. Iptables規則 3.1 規則的匹配條件與目標動作 常見匹配條件&#xff08;用于篩選數據包&…

Vue 服務端渲染(SSR)詳解

Vue SSR是一種在服務端將 Vue 應用渲染成 HTML 字符串&#xff0c;然后直接發送到客戶端的技術。相比傳統的客戶端渲染&#xff0c;Vue SSR 能帶來更好的 SEO 性能和更快的首屏加載時間。下面我們從零到一&#xff0c;結合項目源碼&#xff0c;詳細講解如何實現一個 Vue SSR 項…

機器翻譯:需要了解的數學基礎詳解

文章目錄一、概率論與統計學1.1 基本概念1.2 在機器翻譯中的應用二、線性代數2.1 基本概念2.2 在機器翻譯中的應用三、微積分3.1 基本概念3.2 在機器翻譯中的應用四、信息論4.1 基本概念4.2 在機器翻譯中的應用五、數值優化5.1 優化問題形式化5.2 優化算法5.3 正則化技術六、圖…

藍橋杯手算題和雜題簡易做法

一、巧用Excel Excel在解決某些數學問題時非常高效&#xff0c;特別是涉及表格計算、簡單統計和可視化分析時。 門牌制作 這道題是一道基礎題&#xff0c;只需要判斷每個數字有幾個2&#xff0c;然后在加起來即可&#xff0c;但是還有更簡單的方法&#xff0c;先通過編譯器&…

5. 緩存-Redis

文章目錄前言一、 介紹1. 簡介2. 核心特點二、 應用場景1. 應用場景2. 數據類型作用場景三、 性能特性1. 內存2. 高性能數據結構3. 單線程、多路復用四、 異步持久化機制1. RDB&#xff08;Redis Database&#xff09;2. AOF&#xff08;Append-Only File&#xff09;3. 持久化…

如何理解Tomcat、Servlet、Catanalina的關系

目錄 背景&#xff1a; 結論&#xff1a; 好文-【拓展閱讀】&#xff1a; 象漂亮更新動力&#xff01; 背景&#xff1a; 學習Java的Servlet時&#xff0c;常常說Tomcat是一個容器&#xff0c;我們寫ServletA,ServletB,Tomcat容器在啟動的時候會讀取web.xml或者我們程序中的…

Hive的并行度的優化

對于分布式任務來說&#xff0c;任務執行的并行度十分重要。Hive的底層是MapReduce&#xff0c;所以Hive的并行度優化分為Map端優化和Reduce端優化。(1)、Map端優化Map端的并行度與Map切片數量相關&#xff0c;并行度等于切片數量。一般情況下不用去設置Map端的并行度。以下特殊…

Vue.js 響應接口:深度解析與實踐指南

Vue.js 響應接口&#xff1a;深度解析與實踐指南 引言 隨著前端技術的不斷發展&#xff0c;Vue.js 作為一種流行的前端框架&#xff0c;已經成為了眾多開發者的首選。Vue.js 的響應式系統是其核心特性之一&#xff0c;它允許開發者輕松實現數據的雙向綁定。而響應接口則是Vue.j…

高精度藍牙定位:技術、應用與未來發展

一、高精度藍牙定位概述在當今科技飛速發展的時代&#xff0c;定位技術的精度和可靠性變得越來越重要。高精度藍牙定位作為一種新興的定位技術&#xff0c;正逐漸嶄露頭角。藍牙技術是一種支持設備短距離通信&#xff08;一般10m內&#xff09;的無線電技術&#xff0c;能在包括…

C# 基于halcon的視覺工作流-章29-邊緣提取-亞像素

C# 基于halcon的視覺工作流-章29-邊緣提取-亞像素 本章目標&#xff1a; 一、1edges_sub_pix&#xff1b; 二、threshold_sub_pix&#xff1b;本實例實現過程與章28基本相同&#xff0c;不同處在于提取的邊緣是亞像素&#xff0c;精度較高&#xff0c;本文僅介紹不同之處&#…

如何實現PostgreSQL的高可用性,包括主流的復制方案、負載均衡方法以及故障轉移流程?

前言 實現 PostgreSQL 的高可用性&#xff08;High Availability, HA&#xff09;是一個系統工程&#xff0c;需要結合復制技術、連接路由&#xff08;負載均衡&#xff09;、自動故障轉移&#xff08;Failover&#xff09;以及監控告警。以下是主流方案和關鍵流程的詳細說明&a…