學習嵌入式第二十五天

IO

1.概念

  • IO指input/output
  • Linux中一切皆文件
  • IO的操作對象是文件

2.文件

  • 一段數據的集合

  • 文件通常存放在外存中,掉電后數據不丟失

  • 分類

    • b(block,塊設備文件)

      按塊掃描信息的文件。通常存儲類型的設備為塊設備文件。文件IO

    • c(character,字符設備文件)

      按字符掃描信息的文件,一般設備通常為字符設備文件。文件IO

    • d(directory,目錄文件)

      目錄文件,存放文件的文件夾。目錄IO/文件IO

    • -(普通文件)

      存放信息。標準IO,文件IO

    • l(link,鏈接文件)

      操作文件等價于操作文件指向的文件。鏈接IO/文件IO

    • s(socket,套接字文件)

      用來進程間通信。文件IO

    • p(pipe,管道文件)

      用來進程間通信。文件IO

3.標準IO

  • 通常用來操作普通文件

1.普通文件類型

  • ASCII碼文件:文件中的所有內容均為能夠在屏幕上顯示的ASCII碼字符
    • 程序,文本文件均為ASCII碼文件
  • 二進制文件:文件中的所有內容均為數據對應的二進制形式存放(包含一些不能再界面上顯示的內容)
    • ASCII碼文件也是二進制文件
    • 圖片,音視頻,壓縮包均為二進制文件

2.標準IO接口

  • fopen/fclose
  • fgetc/fputc
  • fgets/fputs
  • fscanf/fprintf
  • fread/fwrite
  • fseek/rewind/ftell
  • 操作步驟:打開,讀寫,關閉

3.文件的打開

函數接口
  1. fopen

    原型:FILE *fopen(const char *pathname, const char *mode);
    功能:打開pathname指向字符串對應的文件,并和他建立一個流
    參數:pathname:要打開的文件路徑字符串mode:打開方式r	只讀	文件存在只讀打開,文件不存在報錯r+	讀寫	文件存在讀寫打開,文件不存在報錯w	只寫	文件存在清0,文件不存在創建,只寫打開w+	寫讀	文件存在清0,文件不存在創建,寫讀打開a	追加	文件存在追加,文件不存在創建,只寫打開a+	追加讀寫	文件存在追加,文件不存在創建,寫讀打開
    返回值:成功返回FILE*指針失敗返回NULL
    
  2. fclose

    原型:int fclose(FILE *stream);
    功能:關閉已經打開的流
    參數:stream:文件流指針
    返回值:成功返回0失敗返回EOF(-1)
    
  3. fputc

    原型:int fputc(int c, FILE *stream);
    功能:將字符c寫入流中
    參數:c:要寫入的字符stream:文件流指針
    返回值:成功返回輸出的ASCII碼值失敗返回EOF
    
    • putchar()等價于fputc(ch,stdout)
  4. fgetc

    原型:int fgetc(FILE *stream);
    功能:讀取流中的下一個字符
    參數:stream:文件流指針
    返回值:成功返回讀到字符的ASCII碼值失敗或者讀到文件末尾返回EOF
    
    • ch = getchar()等價于ch = fgetc(stdin)
  5. fputs

    原型:int fputs(const char *s,FILE *stream);
    功能:向流中寫入s指向的字符串
    參數:s:寫入的字符串的首地址stream:文件流指針
    返回值:成功返回非負數失敗返回EOF
    
    • fputs不會多打印\n字符
    • puts會多打印一個\n字符
  6. fgets

    原型:char *fgets(char *s, int size, FILE *stream);
    功能:從流中最多讀size個字節數據放入s指向的空間中,遇到\n讀取截止
    參數:s:寫入字符串的首地址size:最多存放元素的個數stream:文件流指針
    返回值:成功返回存放數據空間的首地址失敗返回NULL讀到文件末尾返回NULL
    
    • gets會去掉從終端接收的\n字符
    • fgets不會去掉,并在最后加\0
  7. fprintf

    原型:int fprintf(FILE *stream, const char *format, ...);
    功能:將格式化的字符串打印在流中
    參數:stream:文件流指針format:格式化的字符串...:參數
    返回值:成功返回打印字符的個數失敗返回負數
    
  8. fscanf

    原型:int fscanf(FILE *stream, const char *format, ...);
    功能:從流中接收格式化的字符串
    參數:stream:文件流指針format:格式化的字符串...:參數
    返回值:成功返回匹配的輸入控制符的個數失敗返回EOF讀到末尾返回EOF
    

練習1:

  1. 從終端接收一個文件名,在終端打印出他的行數

    #include<stdio.h>
    #include<string.h>
    #include<error.h>int get_line(char *pfile){int cnt = 1;FILE *fp = fopen(pfile,"r");char ch = 0;fp = fopen(pfile,"r");if(fp == NULL){perror("fail to fopen");return -1;}while(1){ch = fgetc(fp);if(ch == '\n'){cnt++;}if(EOF == ch){break;}}fclose(fp);return cnt;
    }int main(void){char filepath[256] = {0};int line = 0;printf("請輸入文件名:");   gets(filepath);line = get_line(filepath);printf("有%d行\n",line);return 0;
    }
    
  2. 將一個文件的內容拷貝到另一個文件中

    #include<stdio.h>
    #include<string.h>
    #include<error.h>int main(void){char filename[100] = {0};char filename2[100] = {0};FILE* fp = NULL;FILE*fp2 = NULL;char ch = 0;printf("輸入源文件名:");gets(filename);fp = fopen(filename,"r");if(fp == NULL){perror("fail to open");return -1;}printf("輸入新文件名:");gets(filename2);fp2 = fopen(filename2,"w");if(fp2 == NULL){perror("fail to open");return -1;}while(1){ch = fgetc(fp);if(EOF == ch){break;}fputc(ch,fp2);}fclose(fp);fclose(fp2);return 0;}
    

已經打開的三個特殊的流

  • stdin:標準輸入流

    scanf,gets,getchar都是通過stdin流實現獲得終端信息

  • stdout:標準輸出流

    printf,puts,putchar都是通過stdout流實現在終端信息打印

  • stderr:標準出錯流

    perror通過stderr流實現在終端打印出錯信息

4.標準IO的緩存

  • 效率高,實時性差
1.緩存類型
  • 全緩存

    緩存區滿刷新緩存

    刷新條件:

    • 緩存區滿4k刷新

    • fflush函數強制刷新

    • fclose或者程序關閉刷新

    與文件建立的緩存一般為全緩存

  • 行緩存

    遇到\n刷新緩存區

    刷新條件:

    • 緩存區滿1k刷新
    • fflush函數強制刷新
    • fclose或者程序關閉刷新
    • 遇到\n刷新

    與終端建立的緩存一般為行緩存(stdin,stdout均為行緩存)

  • 不緩存

    立即刷新不緩存

    刷新條件:

    • 不緩存立即刷新

    出錯處理或者人機交互一般使用不緩存

習題

1.利用fgets和fputs實現文件內容的拷貝

代碼實現:

#include<stdio.h>
#include<string.h>void copyfile(char *src,char *dst){FILE *srcfile = NULL;FILE *dstfile = NULL;char ch[1024] = {0};srcfile = fopen(src,"r");if(srcfile == NULL){printf("打開源文件失敗!\n");return;}dstfile = fopen(dst,"w");if(dstfile == NULL){printf("打開目標文件失敗!\n");fclose(srcfile);return;}while(fgets(ch,sizeof(ch),srcfile) != NULL){fputs(ch,dstfile);}fclose(srcfile);fclose(dstfile);return;
}int main(void){char srcfile[100] = {0};char dstfile[100] = {0};printf("請輸入源文件:");fgets(srcfile,sizeof(srcfile),stdin);srcfile[strlen(srcfile) - 1] = 0;printf("請輸入目標文件:");fgets(dstfile,sizeof(dstfile),stdin);dstfile[strlen(dstfile) - 1] = 0;copyfile(srcfile,dstfile);return 0;
}

2.從終端接受數字,將數字存放在文件中,程序實時顯示當前所有數字的平均數,如果程序關閉再次啟動時能夠顯示之前用戶輸入的所有數字的平均值

代碼實現:

#include<stdio.h>int main(void){FILE *fp = NULL;int sum = 0;int num = 0;int count = 0;float average = 0;fp = fopen("number.txt","a+");if(fp == NULL){perror("fail to fopen");return -1;}while(fscanf(fp,"%d",&num) == 1){sum += num;count++;}while(1){fprintf(stdout,"請輸入一個數字:");fscanf(stdin,"%d",&num);if(num < 0) {fprintf(stdout, "輸入結束,程序退出。\n");break;}fprintf(fp,"%d\n",num);sum += num;count++;average = (float)sum / count;fprintf(stdout,"%f\n",average);}fclose(fp);return 0;
}

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

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

相關文章

本地部署接入 whisper + ollama qwen3:14b 總結字幕

1. 實現功能 M4-1 接入 whisper ollama qwen3:14b 總結字幕 自動下載視頻元數據如果有字幕&#xff0c;只下載字幕使用 ollama 的 qwen3:14b 對字幕內容進行總結 2.運行效果 &#x1f50d; 正在提取視頻元數據… &#x1f4dd; 正在下載所有可用字幕… [youtube] Extracting U…

【13-向量化-高效計算】

研究者能夠擴展神經網絡并構建非常大型網絡的原因之一&#xff0c;就是神經網絡可以被向量化&#xff0c;vectorized&#xff1b;可以非常高效地用矩陣地乘法實現。 事實上&#xff0c;并行計算硬件&#xff0c;例如GPU&#xff0c;一些CPU的功能&#xff0c;非常擅長進行非常大…

論文中PDF的公式如何提取-公式提取

Mathcheap - An AI-powered, free alternative to Mathpix Snip. 從PDF中截圖公式&#xff0c;之后 ctrl V 轉換成功 &#xff0c;提取成功 復制到word中&#xff0c;是這樣的 這顯然不是我們需要的。 可以使用Axmath 復制進去Axmath 就能正常顯示公式。 之后再插入word…

用 Flink SQL 和 Paimon 打造實時數倉:深度解析與實踐指南

1. 實時數倉的魅力&#xff1a;從離線到分鐘級的飛躍實時數倉&#xff0c;聽起來是不是有點高大上&#xff1f;其實它沒那么神秘&#xff0c;但確實能讓你的數據處理能力像坐上火箭一樣飆升&#xff01;傳統的離線數倉&#xff0c;像 Hadoop 生態的 Hive&#xff0c;動輒小時級…

【已解決】報錯:WARNING: pip is configured with locations that require TLS/SSL

一、問題背景二、問題分析1. SSL模塊缺失的本質2. Anaconda環境特點三、問題表現四、解決方案詳解1. 完整配置環境變量2. 添加環境變量的步驟3. 測試驗證五、實戰示例六、附加建議七、總結八、參考鏈接一、問題背景 在Windows 10系統中使用Python的包管理工具pip時&#xff0c…

Java項目基本流程(三)

一、頁面初始化階段&#xff08;加載即執行&#xff09;加載欄目列表&#xff08;同步請求&#xff09;發送同步 AJAX 請求到SearchChannel接口&#xff0c;獲取所有欄目數據。清空下拉框&#xff08;.channelid&#xff09;后&#xff0c;先添加 “全部” 選項&#xff0c;再循…

鷓鴣云光伏仿真:項目前期決策的“數據明燈”

曾有一處光伏項目&#xff0c;在精心籌備數月后終于建成&#xff0c;卻在運行初期即因未充分評估山體遮擋影響&#xff0c;導致實際發電量較預期大幅降低近一成。前期決策中的微小疏漏&#xff0c;往往成為項目經濟性與可行性的致命傷。而鷓鴣云光伏仿真軟件正是一盞照亮前路的…

開發指南129-基礎類-BaseController

所有接口都需要繼承BaseControllerBaseController里有很多有用的方法&#xff0c;現舉例最重要的幾個&#xff1a;1、getURI返回接口地址&#xff0c;就是PostMapping或GetMapping中定義的接口地址。常用于返回值中&#xff0c;例如接口的異常處理&#xff1a;try {// 處理邏輯…

C++高頻知識點(十八)

文章目錄86. C多線程中&#xff0c;鎖的實現方式有哪些&#xff1f;1. 互斥鎖&#xff08;Mutex&#xff09;2. 遞歸互斥鎖&#xff08;Recursive Mutex&#xff09;3. 讀寫鎖&#xff08;Shared Mutex&#xff09;4. 自旋鎖&#xff08;Spinlock&#xff09;5. 條件變量&#…

【C語言強化訓練16天】--從基礎到進階的蛻變之旅:Day1

&#x1f525;個人主頁&#xff1a;草莓熊Lotso &#x1f3ac;作者簡介&#xff1a;C研發方向學習者 &#x1f4d6;個人專欄&#xff1a; 《C語言》 《數據結構與算法》《C語言刷題集》《Leetcode刷題指南》 ??人生格言&#xff1a;生活是默默的堅持&#xff0c;毅力是永久的…

【軟考中級網絡工程師】知識點之 TCP 協議深度剖析

目錄一、TCP 協議簡介二、TCP 協議的特點2.1 面向連接2.2 可靠性高2.3 擁塞控制2.4 全雙工通信2.5 高效性2.6 支持多種應用協議2.7 可靠的錯誤恢復三、TCP 協議的工作機制3.1 三次握手建立連接3.2 數據傳輸3.3 四次揮手關閉連接四、TCP 協議的數據包格式五、TCP 協議在實際應用…

操作系統1.5:操作系統引導

目錄 總覽 什么是操作系統引導&#xff1f; 磁盤里邊有哪些相關數據? 操作系統引導(開機過程&#xff09; 總覽 什么是操作系統引導&#xff1f; 操作系統引導(boot)——開機的時候&#xff0c;怎么讓操作系統運行起來? 磁盤里邊有哪些相關數據? 一個剛買來的磁盤(硬…

[鷓鴣云]光伏AI設計平臺解鎖電站開發新范式

1.[鷓鴣云]平臺概述[鷓鴣云]是由鷓鴣云&#xff08;徐州&#xff09;信息技術有限公司傾力打造的&#xff0c;可以媲美?PVsyst的光伏AI設計平臺。它為光伏項目不同階段的開發提供了快速設計、衛星地圖設計、無人機3D設計、Unity3D設計、專業繪圖設計與場區設計多種設計方式&am…

docker compose和docker-compose命令的區別

Docker Compose 有兩種命令形式&#xff1a;docker compose&#xff08;空格連接&#xff09;docker-compose&#xff08;短橫線連接&#xff09;其核心區別如下&#xff1a;一、技術特性docker-compose&#xff08;短橫線&#xff09;獨立可執行文件&#xff1a;作為獨立程序安…

基于Strands Agent開發輔助閱讀Agent

序 本篇由來&#xff0c;在COC上我當面感謝了組委會和姜寧老師&#xff0c;隨即被姜寧老師催稿&#xff0c;本來當天晚上寫了一個流水賬&#xff0c;感覺甚為不妥。于是決定慢慢寫&#xff0c;緩緩道來。要同時兼顧Show me the code&#xff0c;Show me the vide。希望能形成一…

20250807簡單樹上問題

引入 樹是一種特殊的圖&#xff0c;因其看起來像一顆倒掛的樹而得名。 樹有許多等價的形式化定義&#xff0c;我們這里只取一個&#xff1a;nnn個點n?1n-1n?1條邊的無向連通圖。 樹的直徑 定義樹上任意兩點之間最長的簡單路徑為樹的直徑。 一棵樹可能有很多直徑&#xff0c…

諾基亞就4G/5G相關專利起訴吉利對中國汽車及蜂窩模組企業的影響

諾基亞于2025年7月18日向歐洲統一專利法院&#xff08;UPC&#xff09;曼海姆分庭和德國慕尼黑法院提起訴訟&#xff0c;控訴中國吉利控股集團及其極氪、領克、路特斯、Smart等關聯品牌在未經許可的情況下使用諾基亞4項蜂窩通信標準必要專利 。涉案專利包括1項覆蓋4G/5G的標準必…

Kotlin反射詳解

反射是一種機制&#xff0c;它允許我們在運行時檢查、修改和操作類或對象的內部結構。反射開啟了動態編程的可能性&#xff0c;在開發庫、框架或工具等場景中非常有用。Java 中的反射 在 Java 中&#xff0c;反射一直是實現動態編程的重要基石。它允許開發者在不提前知道類名的…

學習嵌入式-IMX6ULL學習——中斷

volatile&#xff1a;易變的&#xff0c;防止系統優化對寄存器做處理的時候使用&#xff0c;在進行寫1清零操作時&#xff0c;防止該操作被系統優化&#xff1b;一、GIC通用中斷控制器1.GIC通用中斷控制器GIC接收眾多外部中斷&#xff0c;然后對其進行處理&#xff0c;最終通過…

HENGSHI SENSE 6.0 功能-AI 查數助手

面向所有AI Agent開放BI和數據分析能力 AI 查數助手 6.0版本中&#xff0c;我們AI助手的優化是比較深入且全面的。從問答效率到集成能力&#xff0c;都得到了大的躍升&#xff0c;是智能問數應用場景的重大升級以及體驗的全方位優化。我們優化了 AI 助手執行流程&#xff0c;…