io學習----->標準io

思維導圖:

一.io的作用

io是實現對文件的操作,把運行結果存到文件中,讀取文件的數據,方便后期查詢。

二.io的概念

io是指系統 和外部設備或用戶之間的數據交互

I:input 表示數據從外部設備輸入到內存中;

O:output表示數據從內存中輸出到外部設備的過程。

三.io的分類

io分為文件io和標準io;

標準io:指程序和用戶之間的數據交互,標準io=文件io+緩沖區

文件io:指程序和系統之間的數據交互

四.文件io和標準io的區別

標準io:

  1. 滿足ANS的標準,當編譯程序后,可以在不同的編譯環境下執行
  2. 存在緩沖區,加快訪問速度
  3. 可移植性強,可以在不同的編譯環境下執行
  4. 屬于庫函數調用,只可以訪問普通文件
  5. 標準io操作文件時需要依賴于流指針(FILE*)

文件io

  1. 滿足POIX標準,只可以在unix操作系統中使用
  2. 不存在緩沖區,訪問速度慢
  3. 不可移植,系統調用,依賴系統
  4. 屬于系統函數調用,可以訪問特殊文件(連接文件,設備文件,管道文件)
  5. 文件io操作系統時需要依賴文件描述符

五.標準io函數

? ? ? ? 1.流和流指針

  • 流:數據一個一個移入或移出緩沖區的過程,稱為字節流

  • 流指針FILE*: 本質FILE是一個結構體的別名,當存儲./a.out的運行結果,需要創建一個文件,每常見一個文件則會在用戶空間申請一片緩沖區。緩沖區存在一些信息(緩沖區的首地址,緩沖區的結束地址等)存在流指針

  • 注意FILE默認已經存在的,程序員直接使用即可

????????2.查看流指針

  • 1.查看數據類型 vi -t 類型 ----》vi -t FILE
  • 2.追代碼 ctrl? ? ] (右中括號)
  • 3.返回 ctrl t?

? ? ? ? 3.標準io函數

  • 1.fopen-------->文件操作:打開,讀取,寫入,關閉。

    r

    以讀的方式打開文件,流指針指向文件的起始地址,如果文件存在則打開成功,不存在則打開失敗

    r+

    以讀寫的方式打開文件. ,流指針指向文件的起始地址,如果文件存在則打開成功,不存在則打開失敗

    w

    以寫的方式打開文件,如果文件不存在則創建文件,如果文件存在則清空文件

    w+

    以讀寫的方式打開文件,如果文件不存在則創建文件,如果文件存在則清空文件

    a

    以追加的方式打開文件(寫入到文件的結尾)如果文件不存在則創建文件,如果文件存在則流指針指向文件的結尾

    a+

    以讀寫(追加)的方式打開文件(寫入到文件的結尾)如果文件不存在則創建文件,如果文件存在則流指針指向文件的結尾

  • 2.strerror\perror---------功能:根據錯誤碼,返回一個錯誤碼對應的信息

streeor只返回錯誤信息,沒有詳細信息,perror 返回錯誤信息的同時會給一個提示語句

perror截圖:

? ? ? ? 3.fgetc\fputc

fputc:輸出的函數,對于文件,就是寫入的意思

fgetc:輸入的函數,對于文件,讀取的意思

????????4.fclose

功能:關閉文件

????????5.fseek\rewind\ftell

fseek:功能:設置指針的偏移量(設置光標的位置)

?#include <stdio.h>

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

參數:

stream: 流指針,就是fopen的fp

????????offset: 指針的偏移量,

如果offset>0 ,指針向后偏移

如果offset<0 指針向前偏移

offset=0 指針不偏移

????????whence:

SEEK_SET 把光標設置在起始位置

SEEK_CUR 把光標設置在當前位置

SEEK_END 把光標設置在結尾位置

rewind:把光標設置在起始位置

????????void rewind(FILE *stream);

ftell:獲取當前指針到起始地址之間的文件大小

????????1.把光標設置在文件的結尾 fseek(fp,0,SEEK_END);

????????2.獲取文件大小 long size=ftell(fp)

????????6.fputs\fgets

fputs:功能:從文件流指針中寫入字符串

格式: int fputs(const char *s, FILE *stream);

fgets:功能:從文件流指針中讀取字符串

格式: char *fgets(char *s, int size, FILE *stream);

size: 只可以獲取小于size個字符,最多存儲size-1

六、練習

  1. 使用標準IO函數,實現文件的拷貝
     #include <head1.h>int main(int argc, const char *argv[]){FILE *fp=fopen("IO.text","r");if(NULL==fp){PRINT_ERROR("fopen");}FILE* fp1=fopen("IO.1text","w");//讀取文件,然后寫入while(1 ){char ch=(fgetc(fp));if(EOF==ch){break;}fputc(ch,fp1);}fclose(fp); fclose(fp1);                      return 0;}
    

  2. 使用fgets函數,打印一個文件,類似cat

    #include <head1.h>2 int main(int argc, const char *argv[])3 {4     //打開文件5     FILE* fp=fopen("./IO.1text","r");6         if(NULL==fp)7         {8             PRINT_ERROR("fopen");9         }10         11     //讀取數據12     while(1)13 {   14     int res=fgetc(fp);15     if(EOF==res)16     {17     //  printf("讀取失敗");18     //  return -1;19         break;20     }   21     printf("%c",res);22 }   23 /*  int res;24     while((res=fgetc(fp)) != EOF)25     {26         printf("%c",res);27     }   28 */                                                   29     //關閉文件30         if(fclose(fp)==EOF)31             PRINT_ERROR("fopen");32             33     return 0;34 }   
    

  3. 計算文件的行數

#include <head1.h>
int main(int argc, const char *argv[])
{//打開文件FILE* fp=fopen("IO.text","r+");if(NULL==fp){   PRINT_ERROR("fopen error");}int count=0;//循環讀取,遇到回車計算行數while(1){   char ch =fgetc(fp);if(ch==EOF){break;}if(ch==10){count++;}}printf("這個文件有%d行\n",count);fclose(fp);return 0;
}

?

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

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

    相關文章

    使用消息隊列怎樣防止消息重復?

    大家好&#xff0c;我是君哥。 使用消息隊列時&#xff0c;我們經常會遇到一個可能對業務產生影響的問題&#xff0c;消息重復。在訂單、扣款、對賬等對冪等有要求的場景&#xff0c;消息重復的問題必須解決。 那怎樣應對重復消息呢&#xff1f;今天來聊一聊這個話題。 1.三…

    005 公網訪問 docker rocketmq

    文章目錄 創建自定義網絡創建NameServer容器創建Broker容器正式開始啟動 Nameserver 容器啟動 Broker 容器并關聯 Nameserverdocker exec -it rmqbroker vi /etc/rocketmq/broker.conf檢查 namesrv 解析檢查 Broker 注冊狀態Nameserver 日志Broker 日志檢查容器日志手動指定 Br…

    解決Docker Desktop啟動后Docker Engine stopped問題

    一、問題描述 當我們更新了Docker Desktop后,在重新打開就顯示【Docker Engine stopped(Docker引擎已經停止)】,無法正常使用Docker,如下圖所示: 二、問題分析 1、檢查電腦主板的CPU是否開啟虛擬化; 2、需檢查Docker所需的功能是否開啟; 3、檢查WSL是否匹配; Docker的…

    MongoDB—(一主、一從、一仲裁)副本集搭建

    MongoDB集群介紹&#xff1a; MongoDB 副本集是由多個MongoDB實例組成的集群&#xff0c;其中包含一個主節點&#xff08;Primary&#xff09;和多個從節點&#xff08;Secondary&#xff09;&#xff0c;用于提供數據冗余和高可用性。以下是搭建 MongoDB 副本集的詳細步驟&am…

    C++STL---<limits>

    C <limits> 頭文件&#xff1a; <limits> 頭文件是 C 標準庫中用于獲取各種數據類型的數值范圍、精度等信息的工具。它通過模板類 std::numeric_limits 提供了對基本數據類型&#xff08;如 int、float、double 等&#xff09;的詳細屬性查詢功能。通過 std::nume…

    藍橋杯自我復習打卡

    總復習&#xff0c;打卡1. 一。排序 1。選段排序 太可惡了&#xff0c;直接全排輸出&#xff0c;一個測試點都沒過。 AC 首先&#xff0c;這個【l,r】區間一定要包含p,或者q&#xff0c;pq一個都不包含的&#xff0c;[l,r]區間無論怎么變&#xff0c;都對ans沒有影響。 其次&…

    Flutter_學習記錄_實現列表上拉加載更多的功能

    可以用ScrollController組件來實現這樣列表上拉加載更多的功能: 1. 定義變量 在StatefulWidget 的組件內&#xff0c;添加三個屬性&#xff1a; // 滾動視圖的控制器final ScrollController _scrollController ScrollController();// 是否已顯示了上拉加載中bool _isShowM…

    【Linux】【網絡】不同子網下的客戶端和服務器通信其它方式

    【Linux】【網絡】不同子網下的客戶端和服務器通信其它方式 那么&#xff0c;在 NAT 環境下&#xff0c;應該如何讓內網設備做為服務器&#xff0c;使內網設備被外部連接&#xff1f; 1 多撥 部分運營商&#xff0c;支持在多個設備上&#xff0c;通過 PPPoE 登錄同一個寬帶賬…

    《Python百練成仙》31-40章(不定時更新)

    第卅一章 函數結丹def開紫府 羅酆山的鬼門關吞吐著猩紅的變量陰風&#xff0c;每個風眼都涌動著作用域混亂的靈力亂流。葉軍手握薛香遺留的丹田玉簡&#xff0c;玉簡表面浮現出殘缺的函數符文&#xff1a; def 凝聚金丹(靈氣):道基 靈氣 * 0.618print(金丹品質) # 作用域外變…

    六十天前端強化訓練之第一天到第七天——綜合案例:響應式個人博客項目

    歡迎來到編程星辰海的博客講解 目錄 前言回顧 HTML5與CSS3基礎 一、知識講解 1. 項目架構設計&#xff08;語義化HTML&#xff09; 2. 響應式布局系統&#xff08;Flex Grid&#xff09; 3. 樣式優先級與組件化設計 4. 完整響應式工作流 二、核心代碼示例 完整HTML結…

    測試的BUG分析

    在了解BUG之前,我們要先了解軟件測試的生命周期,因為大多數BUG都是在軟件測試的過程中被發現的 軟件測試的生命周期 在了解 軟件測試的生命周期 之前,我們要先了解 軟件的生命周期 ,雖然他們之間只差了兩個字,但是差距還是很大的 首先是 軟件生命周期 ,這個是站在 軟件 的角…

    【洛谷貪心算法題】P1094紀念品分組

    該題運用貪心算法&#xff0c;核心思想是在每次分組時&#xff0c;盡可能讓價格較小和較大的紀念品組合在一起&#xff0c;以達到最少分組的目的。 【算法思路】 輸入處理&#xff1a;首先讀取紀念品的數量n和價格上限w&#xff0c;然后依次讀取每件紀念品的價格&#xff0c;…

    [STM32]從零開始的STM32 BSRR、BRR、ODR寄存器講解

    一、前言 學習STM32一陣子以后&#xff0c;相信大家對STM32 GPIO的控制也有一定的了解了。之前在STM32 LED的教程中也教了大家如何使用寄存器以及庫函數控制STM32的引腳從而點亮一個LED&#xff0c;之前的寄存器只是作為一個引入&#xff0c;并沒有深層次的講解&#xff0c;在教…

    SQL分組問題

    下列為電商公司用戶訪問時間數據 統計某個用戶連續的訪問記錄&#xff0c;如果時間間隔小于60s&#xff0c;就分為一組 id ts 1001 17523641234 1001 17523641256 1002 17523641278 1001 17523641334 1002 17523641434 1001 17523641534 1001 17523641544 1002 17523…

    3月2日 C++日常習題測試一答案

    C測試題答案與講解 一、填空題答案及講解 答案&#xff1a;const 講解&#xff1a;在 C 中&#xff0c;const關鍵字用于定義常量&#xff0c;一旦定義&#xff0c;其值不能被修改。例如const int num 10;&#xff0c;這里的num就是一個常量。 答案&#xff1a;3 講解&…

    2W8000字 LLM架構文章閱讀指北

    ? 大模型架構專欄已經更新了30多篇文章。完整的專欄內容歡迎訂閱&#xff1a; LLM 架構專欄 1、LLM大模型架構專欄|| 從NLP基礎談起 2、 LLM大模型架構專欄|| 自然語言處理&#xff08;NLP&#xff09;之建模 3、 LLM大模型架構之詞嵌入&#xff08;Part1&#xff09; 3、 LLM…

    SP導入智能材質球

    智能材質球路徑 ...\Adobe Substance 3D Painter\resources\starter_assets\smart-materials 放入之后就會自動刷新

    網絡原理----TCP/IP(3)

    核心機制七----延時應答 默認情況下&#xff0c;接收方都是在收到數據報的第一時間&#xff0c;就返回ack&#xff0c;但是可以通過延時返回ack的方式來提高效率&#xff0c;理論上不是100%提高效率&#xff0c;但還是有一定幫助的。 因為如果接收數據的主機?刻返回ACK應答,…

    MacBook Pro使用FFmpeg捕獲攝像頭與麥克風推流音視頻

    FFmpeg查看macos系統音視頻設備列表 ffmpeg -f avfoundation -list_devices true -i "" 使用攝像頭及麥克風同時推送音頻及視頻流: ffmpeg -f avfoundation -pixel_format yuyv422 -framerate 30 -i "0:1" -c:v libx264 -preset ultrafast -b:v 1000k -…

    部署Joplin私有云服務器postgres版-docker compose

    我曾經使用過一段時間 Joplin&#xff0c;官方版本是收費的&#xff0c;而我更傾向于將數據掌握在自己手中。因此&#xff0c;在多次權衡后&#xff0c;我決定自己搭建 Joplin 服務器并進行嘗試。 個人搭建的版本與數據庫直連&#xff0c;下面是使用 Docker Compose 配置數據庫…