數據結構學習day6---流+讀寫函數+緩沖+定義函數

目錄

1.標準io;?stdio.h

1.1標準io的概念?

1.2Linux操作系統當中IO都是對文件的操作

1.3標準IO:ANSI?C?設計的一組用文件IO?封裝的操作庫函數

2.文件

2.1作用

2.2linux中文件的類型

3.man??

5.流:???FILE*

5.1流的定義

5.2流的分類

6.c語言文件讀寫操作函數

6.1操作步驟

6.2函數

6.2.1打開

fopen

6.2.2讀寫操作相關

1)fputc

2)fgetc

3)fputs

4)fgets

注意:

5)fwrite(二進制)

6) fread(二進制)

6.2.3關閉

fclose

7.緩沖

7.1行緩沖

7.1.1大小

7.1.2操作位置

7.1.3刷新條件

7.1.4操作指令

7.2全緩沖

7.2.1大小

7.2.2作用

7.2.3刷新條件

7.3無緩沖

7.3.1大小

7.3.2作用

7.3.3不對數據緩存直接刷新

8.標準IO之文件定位

8.1fseek

8.2ftell

8.3rewind


1.標準io;?stdio.h

1.1標準io的概念?

1975?Dennis?r?IO庫,C語言的標準,ANSI?c?
IO??input??output
I:?鍵盤是標準輸入設備?====》默認輸入就是指鍵盤??/dev/input
O:?顯示器是標準輸出設備?==》默認輸出就是指顯示器

1.2Linux操作系統當中IO都是對文件的操作

C一部分,任何支持標準C的系統都可使用標準IO實現文件存儲

標準IO在UNIX上是對文件IO的封裝?

一般都是對普通文件操作是一種有緩存的IO?在文件IO和用戶程序之間,加入緩沖區,可以有效減少系統調用的效率,節省系統IO調度資源

1.3標準IO:ANSI?C?設計的一組用文件IO?封裝的操作庫函數

頭文件:?stdio.h??==》標準輸入輸出頭文件
?????????/usr/include/stdio.h

<>???是系統庫函數,默認路徑在/usr/include/

eg?:?====》stdio.h??===>stdio.c==>libc.so?==>/usr/lib??so?動態庫
""???是用戶自定義函數,默認是當前路徑
eg?:?===>xxx.h??===>xxx.c

2.文件

2.1作用

linux中一切都是文件。文件用來存儲數據(數據,指令);

2.2linux中文件的類型

7種,d ,-,l,p管道,s,c,b?用命令演示??link?pip?socket
hello??oellh,,512?
io的分類
標準io,
stdio.h
Dennis?Ritchie

3.man??

man??==>所有man的幫助
man??xxx?==?man?1?xxx?===>查看當前xxx命令
man?2?xxx??===>查看xxx對應的系統調用函數
man?3?xxx??===》查看xxx對應的標準庫函數

注意:如果沒有命令則直接man?xxx?會顯示其函數\n
? ? ? ? ? ?如果沒有系統調用則顯示系統庫函數幫助

printf?scanf?
sprintf
getchar?putchar?gets?puts\n
getc?putc?fgets?fputs?fread?fwrite?ftell
rewind?fseek
文件io,系統調用,底層軟件
文件內容的分類,?文本文件,二進制文件?????

5.流:???FILE*

struct?FILE
{
}

5.1流的定義

數據從文件當中流入和流出所體現出來的字節流叫做流

5.2流的分類

1)二進制流:?2001?\n
2)二進制數據的流
3)文本流:
4)ASCII碼數據的流?\n?\t?
5)FILE?結構定義的對象?FILE?*?稱之為流對象,也叫文件流指針。
流對象?===》頭?《===數據====》尾

stdin??FILE*???scanf?();
stdout?????????printf();
stderr

6.c語言文件讀寫操作函數

6.1操作步驟

1)打開文件??FILE?
2)io操作,讀寫操作
3)關閉文件??

6.2函數

6.2.1打開

fopen

“r”---只讀 文件必須存在

“w”---創建文件,若文件存在則清空

“r+”---文件存在,進行讀寫

“w+”---創建一個用于讀寫的空文件

“a”---文件不存在則創建,追加 找到文件的末尾

“a+”---找到文件末尾讀寫

#include<stdio.h>int main(int argc,char *argv[])
{FILE*fp=fopen("1.txt","w");if(NULL==fp){fprintf(stderr,"open error\n");return 1;}return 0;
}

6.2.2讀寫操作相關

fgetc/fputc,,,,,,一個字符

1)fputc

int fputc(int C,FILE *stream);

功能:向指定的文件流寫入單個字符數據。

特點:每次只寫入一個字符

#include<stdio.h>int main(int argc,char *argv[])
{//1 open file//2 read  write//  close file// 打開,如果文件不存在,創建文件,// 如果存在,清空文件內容  wFILE*fp=fopen("1.txt","w");if(NULL==fp){fprintf(stderr,"open error\n");return 1;}fputc('h',fp);fputc('e',fp);fputc('l',fp);fputc('l',fp);fputc('o',fp);fclose(fp);
}

fgetc(int?c?,FILE*strem);

2)fgetc

int fgetc(FILE *stream);?

功能:?從指定的文件流中逐個字符地讀取數據。

特點:?每次只讀取一個字符,并隨著每次調用向前移動文件指針。返回值類型為 int,以容納 EOF 的負數值。

#include<stdio.h>int main(int argc,char*argv[])
{FILE*fp=fopen("1.txt","r");if(NULL==fp){fprintf(stderr,"open error\n");return 1;}while(1){int c=fgetc(fp);if(EOF==c){break;}printf("%c",c);}return 0;
}

fgets/fputs....,,一次一行

3)fputs

?int fputs(const char *s,FILE *stream);

功能:向指定的文件流寫入字符串數據。

特點:將整個字符串一次性寫入文件。不會在字符串末尾自動添加換行符,如果需要換行,應在字符串中顯式添加。

#include <stdio.h>int	main(int argc, char **argv)
{FILE*fp=fopen("1.txt", "w"); //清空 創建if(NULL==fp){printf("fopen error\n");return 1;}//文本文件的寫fputs("hello\n",fp);  //常量char buf[]="world";fputs(buf, fp);  //變量fclose(fp);// system("pause");return 0;
}
4)fgets

char *fgets(char *s, int size, FILE *stream);?

功能:從指定的文件流中讀取一行字符串,并將其存儲到指定的字符數組中。

特點:一次性讀取一整行,包括換行符(‘\n’),并將其存儲到目標數組中。可以指定最大讀取的字符數,以防止緩沖區溢出。

#include <stdio.h>int	main(int argc, char **argv)
{FILE*fp=fopen("1.txt", "r");  //文件已存在if(NULL==fp){printf("fopen error\n");return 1;}    char buf[512]={0};while(1){char *tmp=fgets(buf, sizeof(buf), fp);if(NULL==tmp)  //到文件的結尾{break;}printf("%s",buf);}fclose(fp);// system("pause");return 0;
}
注意:

1)fputs和fgets只處理文本文件不處理二進制文件

2)od -c 文件

eg:od -c 1.txt? ?----查看1.txt具體內容

3)od -t x1 1.png | less?

----用十六進制查看1.png具體數值

4)hexdump 1.png -C ?|less??

-----十六進制轉儲顯示并顯示ascii碼

5)vimdiff? -----比較兩個文件差異

eg: vimdiff? ?/ect/passwd? 1.txt? ?比較passwd和1.txt的差異

5)fwrite(二進制)

size_t fwrite(const void *ptr,size_t size, size_t nmemb, FILE *Stream);

自定義大小

#include <stdio.h>
#include <string.h>typedef struct {int id;char name[50];char addr[100];}PER;int	main(int argc, char **argv)
{FILE*fp=fopen("1.txt", "w");if(NULL==fp){printf("fopen error\n");return 1;}PER per;bzero(&per, sizeof(per));per.id=10;strcpy(per.name, "zhangsan");strcpy(per.addr, "成都");size_t ret=fwrite(&per, sizeof(per), 1, fp); printf("write num of  item:%lu\n",ret);fclose(fp);return 0;// system("pause");return 0;
}
6) fread(二進制)

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
struct?person
{
char?name[10];
int?age;
char?phone[15];
};
person?son[10];?


#include <stdio.h>
#include <string.h>typedef struct {int id;char name[50];char addr[100];}PER;int	main(int argc, char **argv)
{FILE*fp=fopen("1.txt", "r");if(NULL==fp){printf("fopen error\n");return 1;}PER per;bzero(&per,sizeof(per));size_t ret=fread(&per, sizeof(per), 1, fp);printf("ret:%lu id:%d name:%s addr:%s\n",ret,per.id,per.name,per.addr);fclose(fp);// system("pause");return 0;
}

注意:

atoi----將字符轉換為數字

6.2.3關閉

fclose

7.緩沖

產生原因:內存和屏幕有快有慢

7.1行緩沖

7.1.1大小

1k -----1024

7.1.2操作位置

terminal,主要用于人機交互stdout

行緩存多是關于終端的一些操作

緩存區滿或者遇到\n刷新

7.1.3刷新條件

1.遇到\n刷新

2.緩存區滿刷新

3.程序結束刷新

4.fflush刷新??fflush(stdout);?

7.1.4操作指令

?FILE*fp?????

標準輸入(鍵盤)stdin?

標注輸出(屏幕)stdout?

標準錯誤輸出(屏幕)stderr?

#include <stdio.h>
// #include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
// 情況1// printf("hello");// while(1);//情況2 緩存大小是 1024 字節
//   int i = 0;
//   for (i = 0; i < 1024; i++)
//   {
//     fputc('a', stdout);  // FILE* 標準輸入(鍵盤)stdin  標準輸出(屏幕) stdout
//                          // 標準錯誤輸出(屏幕) stderr
//   }
//   sleep(5);
//   fputc('a', stdout);
//   while (1);//情況3 程序正常結束//printf("hello");//情況4 強制刷新緩沖區printf("hello");fflush(stdout);while(1);return 0;
}

7.2全緩沖

7.2.1大小

4k---4096

7.2.2作用

主要用于文件的讀寫

緩存區滿刷新緩存區?

對普通文件進行標準IO操作,建立的緩存一般為全緩存

7.2.3刷新條件

1.緩存區滿刷新
2.程序正常結束刷新
3.fflush來刷新??fflush(fp);

#include <stdio.h>
// #include <stdlib.h>
#include <unistd.h>
int main(int argc, char** argv)
{// 1// FILE* fp = fopen("1.txt","w");// fputs("hello",fp);// while(1);// 2  4K//   FILE* fp = fopen("1.txt", "w");//   int i = 0;//   for (i = 0; i < 4096; i++)//   {//     fputc('a', fp);//   }//   sleep(10);//   fputc('a', fp);//   while (1);// 3 fflush();FILE* fp = fopen("1.txt", "w");fputs("hello", fp);fflush(fp);while (1);return 0;
}

7.3無緩沖

7.3.1大小

0k? ----0

7.3.2作用

主要用于出錯處理信息的輸出?stderr?

7.3.3不對數據緩存直接刷新

printf(? );==>>stdout?
fprintf(strerr,"fopen?error?%s",filename);
界面交互 出錯處理
使用gdb查看,FILE結構體,或使用寫入數據測試緩沖區。
緩沖區的大小是可以設置

8.標準IO之文件定位

fseek??ftell??rewind

8.1fseek

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

功能:將stream流文件中的文件指針從whence位置開始 偏移offset字節的長度。

參數:

stream要移動文件指針的目標文件流對象。

? ? ? ?注意:不支持設備文件,一般用于普通文件。

offsett要在文件內偏移的距離,單位字節。

? ? ? ? ? ? 如果值為整數,則向文件末尾偏移

? ? ? ? ? ? 如果值為負數,則向文件開頭偏移

whence 偏移的起始位置,由系統定義的三個宏開始。

SEEK_SET 文件的開頭位置

SEEK_CUR文件的當前位置

SEEK_END文件的末尾位置

返回值:

成功:返回0

失敗:-1;

如果從文件的指定位置向后偏移過程中已經超過了文件 的當前末尾位置,則會自動以\0'來填充文件內容,從 而形成一種被稱為"空洞文件"的特殊文件。

#include<stdio.h>
#include <stdlib.h>int	main(int argc, char **argv)
{FILE*fp=fopen("1.txt","r");if(NULL==fp){fprintf(stderr,"fopen error\n");return 1;}fseek(fp,27,SEEK_SET);char buf[50]={0};fgets(buf,sizeof(buf), fp);fclose(fp);printf("buf:%s\n",buf);// system("pause");return 0;
}

8.2ftell

long ftell(FILE *stream);

功能:

獲得文件大小。

返回文件指針相對于起始位置的偏移量。

參數:

stream要移動文件指針的目標文件流對象。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int	main(int argc, char **argv)
{FILE*fp=fopen("1.txt", "r");if(NULL==fp){fprintf(stderr, "fopen error\n");}fseek(fp, 0,SEEK_END);long size=ftell(fp);printf("size:%ld\n",size);fclose(fp);// system("pause");return 0;
}

8.3rewind

void rewind(FILE *stream);

功能:

讓文件流指針回到文件開頭(直接復位到開頭)。

rewind(fp);=====fseek(fp,0,SEET_SET);? 二者等價

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int	main(int argc, char **argv)
{FILE*fp=fopen("1.txt", "r");if(NULL==fp){fprintf(stderr, "fopen error\n");return 1;}fseek(fp, 0, SEEK_END);//文件到達結尾long size=ftell(fp);printf("size:%ld\n",size);char buf[512]={0};rewind(fp);//文件在開頭---pos==0的位置fgets(buf, sizeof(buf), fp);printf("%s\n",buf);fclose(fp);// system("pause");return 0;
}

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

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

相關文章

互聯網醫院,正在發生的醫療新變革

隨著信息技術的飛速發展&#xff0c;互聯網醫院作為醫療服務的新形態&#xff0c;正在全球范圍內迅速崛起。在中國&#xff0c;這一變革尤為顯著&#xff0c;互聯網醫院不僅改善了醫療服務的可及性和便捷性&#xff0c;還極大地提升了醫療服務的質量和效率。 一、互聯網醫院的發…

rabbitmq動態創建交換機、隊列、動態綁定,銷毀

// 緩存已創建的綁定&#xff0c;避免重復聲明private final Map<String, Date> createdBindings new ConcurrentHashMap<>(); public void createAndBindQueueToExchange(String type,String clinetId, String routingKey) {String queueName routingKey;lo…

云效代碼倉庫導入自建gitlab中

登錄自建GitLab 在瀏覽器中輸入GitLab訪問地址http://192.168.1.111:81/users/sign_in&#xff0c;輸入賬號和密碼登錄GitLab服務&#xff0c;如下圖&#xff1a; 新建一個空的代碼庫 按照以下截圖順序&#xff0c;創建一個新的空項目&#xff0c;如下&#xff1a; 克隆鏡像 …

業界優秀的零信任安全管理系統產品介紹

騰訊 iOA 零信任安全管理系統 簡介&#xff1a;騰訊 iOA 零信任安全管理系統是騰訊終端安全團隊針對企業安全上云和數字化轉型&#xff0c;提供的企業網絡邊界處的應用訪問管控系統&#xff0c;為企業應用提供統一、安全、高效的訪問入口&#xff0c;同時提供終端安全加固、軟…

從設計到開發一個小程序頁面

巧婦難為無米之炊&#xff0c;想寫功能但是沒有好看的設計&#xff0c;邊寫邊設計效率又不夠高。mastergoAi生成的頁面又不夠好看&#xff0c;而且每月給的免費積分用得又超快&#xff0c;so決定自給自足。能有多難&#xff0c;先做&#xff0c;做了再改。 于是決定踏足設計&a…

Linux系統 / Ubuntu虛擬機 安裝DHCP服務

一、安裝DHCP服務 xxx:~$ sudo apt install isc-dhcp-server 正在讀取軟件包列表... 完成 正在分析軟件包的依賴關系樹 正在讀取狀態信息... 完成 將會同時安裝下列軟件&#xff1a; libirs-export161 libisccfg-export163 建議安裝&#xff1a; isc-dhcp-s…

Spring中 BeanFactory和FactoryBean分別是什么?

Spring 中 BeanFactory 是什么? BeanFactory其實就是IoC的底層容器&#xff0c;它本身只是一個接口&#xff0c;顧名思義Bean工廠&#xff0c;定義了Spring的基本功能框架&#xff0c;主要功能就是 負責從配置源中讀取 Bean 的定義&#xff0c;并創建、管理這些 Bean 的生命周…

langchain從入門到精通(三十二)——RAG優化策略(八)自查詢檢索器實現動態數據過濾

1. 查詢構建與自查詢檢索器 在 RAG 應用開發中&#xff0c;檢索外部數據時&#xff0c;前面的優化案例中&#xff0c;無論是生成的 子查詢、問題分解、生成假設性文檔&#xff0c;最后在執行檢索的時候使用的都是固定的篩選條件&#xff08;沒有附加過濾的相似性搜索&#xff…

面向安全產品測試的靜態混淆型 Shellcode Loader 設計與對抗分析

github 地址&#xff1a;https://github.com/LilDean17/ShellcodeLoader2025 一、項目背景 近年來&#xff0c;隨著 C2 框架廣泛應用于安全對抗模擬&#xff0c;各大安全廠商也不斷提升其檢測能力&#xff0c;那么安全廠商自研的安全軟件&#xff0c;是否能有效防御此類威脅&…

深度強化學習DRL——策略學習

一、策略網絡 策略函數 π \pi π的輸入是狀態 s s s和動作 a a a&#xff0c;輸出是一個介于0和1之間的概率值&#xff0c;用神經網絡 π ( a ∣ s ; θ ) \pi(a \mid s; \boldsymbol{\theta}) π(a∣s;θ)近似策略函數 π ( a ∣ s ) \pi(a\mid s) π(a∣s)&#xff0c; θ …

ISP Pipeline(5): Auto White Balance Gain Control (AWB) 自動白平衡

G_gain 1.0 # 常作為參考通道 R_gain G_avg / R_avg B_gain G_avg / B_avgAuto White Balance Gain Control&#xff08;AWB&#xff09;自動調整圖像中紅色、綠色、藍色通道的增益&#xff0c;使圖像中灰白區域的顏色看起來為“中性白”或“灰白”&#xff0c;從而矯正因光…

Python中鉤子函數的實現方式

在Python中&#xff0c;鉤子函數(Hook)是一種允許你在程序執行的特定點插入自定義代碼的技術。它本質上是一種回調機制&#xff0c;當特定事件發生時自動調用預先注冊的函數。 Python中鉤子函數的實現方式 Python中實現鉤子主要有以下幾種方式&#xff1a; ?回調函數?&…

【RTSP從零實踐】3、實現最簡單的傳輸H264的RTSP服務器

&#x1f601;博客主頁&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客內容&#x1f911;&#xff1a;&#x1f36d;嵌入式開發、Linux、C語言、C、數據結構、音視頻&#x1f36d; &#x1f923;本文內容&#x1f923;&a…

零開始git使用教程-傳html文件

1. 準備工作 (1) 確保你已經安裝&#xff1a; Visual Studio (VS)&#xff08;任何版本&#xff0c;社區版也行&#xff09; Git&#xff08;去官網 git-scm.com 下載安裝&#xff09; (2) 注冊 Gitee/GitHub 賬號 國內推薦 Gitee&#xff08;碼云&#xff09;&#xff1a;…

CPT204-Advanced OO Programming: Lists, Stacks, Queues, and Priority Queues

目錄 1.Java 集合框架層次結構Java Collection Framework hierarchy 1.1Java 集合框架描述&#xff1a; 1.2數據結構Data structures 1.3 Java 集合框架支持兩種類型的容器&#xff08;數據結構&#xff09;&#xff1a; 1.4 Java 集合框架的設計 2.Collection 2.1 Coll…

【網絡安全】Mysql注入中鎖機制

前言 在sql注入的延時注入中&#xff0c;常見的函數有sleep()直接延時、BENCHMARK()通過讓數據庫進行大量的計算而達到延時的效果、笛卡爾積、正則匹配等&#xff0c;但還有一個常常被忽略的函數&#xff0c;也就是Mysql中的鎖機制。雖然早些年就已經出現過相關的技術文章&…

博途多重背景、參數實例

1&#xff1a;我們在博途中先新建一個工程&#xff0c;并且建立一個FB塊名字為motor_fb&#xff0c;同樣建立一個FC塊名字為MOTOR_FC&#xff0c;里面寫上我們電機程序里常用的邏輯控制。二者程序內容相同。下面是motor_fb塊的程序截圖: 2:我們再新建一個FB塊&#xff0c;名字為…

運維的利器–監控–zabbix–第三步:配置zabbix–中間件–Tomcat–步驟+驗證

&#x1f3e0;個人主頁&#xff1a;fo安方的博客? &#x1f482;個人簡歷&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;目前中南大學MBA在讀&#xff0c;也考取過HCIE Cloud Computing、CCIE Security、PMP、CISP、RHCE、CCNP RS、PEST 3等證書。&#x1f433; &…

大模型在重癥哮喘手術全流程風險預測與治療方案制定中的應用研究

目錄 一、引言 1.1 研究背景與意義 1.2 研究目標與方法 1.3 研究創新點 二、重癥哮喘概述 2.1 定義與發病機制 2.2 分類與臨床表現 2.3 診斷標準與方法 三、大模型技術原理與應用現狀 3.1 大模型的基本原理 3.2 在醫療領域的應用案例分析 3.3 適用于重癥哮喘預測的…

Webpack的插件機制Tapable

Tapable 是一個輕量級的庫&#xff0c;用于創建和管理插件鉤子&#xff08;hooks&#xff09;&#xff0c;它在 Webpack 中廣泛應用&#xff0c;用于實現插件系統。Tapable 提供了一種機制&#xff0c;允許插件在特定的生命周期階段插入自定義邏輯&#xff0c;從而擴展應用程序…