国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

杭州市建設(shè)網(wǎng)站個(gè)人免費(fèi)網(wǎng)站創(chuàng)建入口

杭州市建設(shè)網(wǎng)站,個(gè)人免費(fèi)網(wǎng)站創(chuàng)建入口,博物館網(wǎng)站微信公眾號(hào)建設(shè),網(wǎng)站導(dǎo)入4. 標(biāo)準(zhǔn) IO 庫 1. 標(biāo)準(zhǔn) IO 簡(jiǎn)介2. FILE 指針3. 標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤4. fopen() 和 flose()5. fread() 和 fwrite()6. fseek 定位7. 檢查或復(fù)位狀態(tài)7.1 feof()7.2 ferrof()7.3 clearerr() 8. 格式化 IO8.1 格式化輸出8. 2 格式化輸入 9. IO 緩沖9.1 文件 IO 的內(nèi)核緩沖…

4. 標(biāo)準(zhǔn) IO 庫

  • 1. 標(biāo)準(zhǔn) IO 簡(jiǎn)介
  • 2. FILE 指針
  • 3. 標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤
  • 4. fopen() 和 flose()
  • 5. fread() 和 fwrite()
  • 6. fseek 定位
  • 7. 檢查或復(fù)位狀態(tài)
    • 7.1 feof()
    • 7.2 ferrof()
    • 7.3 clearerr()
  • 8. 格式化 IO
    • 8.1 格式化輸出
    • 8. 2 格式化輸入
  • 9. IO 緩沖
    • 9.1 文件 IO 的內(nèi)核緩沖
    • 9.2 刷新文件 IO 的內(nèi)核緩沖區(qū)
      • 9.2.1 控制文件 IO 內(nèi)核緩沖的系統(tǒng)調(diào)用
      • 9.2.1 控制文件 IO 內(nèi)核緩沖的標(biāo)志
    • 9.3 直接 IO,繞過內(nèi)核緩沖
      • 9.3.1 直接 IO 的對(duì)齊限制
      • 9.3.2 直接 IO 與普通 IO 對(duì)比
    • 9.4 stdio 緩沖
      • 9.4.1 設(shè)置 stdio 緩沖
        • 9.4.1.1 setvbuf()
        • 9.4.1.2 setbuf()
        • 9.4.1.3 setbuffer()
      • 9.4.2 緩沖模式
      • 9.4.3 刷新 stdio 緩沖區(qū)
  • 10. 文件描述符和FILE指針互轉(zhuǎn)

1. 標(biāo)準(zhǔn) IO 簡(jiǎn)介

標(biāo)準(zhǔn) IO 庫指的式標(biāo)準(zhǔn) C 庫中用于文件 IO 操作相關(guān)的一系列庫函數(shù)的集合,底層是用系統(tǒng) IO 實(shí)現(xiàn)的。但是標(biāo)準(zhǔn) IO 比系統(tǒng) IO 具有更好的可移植性,因?yàn)椴煌牟僮飨到y(tǒng)內(nèi)核提供的系統(tǒng)調(diào)用都是不一樣的;其次標(biāo)準(zhǔn) IO 具有更高的效率,因?yàn)闃?biāo)準(zhǔn) IO 提供了自己的緩沖區(qū),但是系統(tǒng) IO 不具備緩沖區(qū)。

2. FILE 指針

FILE 指針就類似于系統(tǒng) IO 的文件描述符,FILE 指針是一個(gè)結(jié)構(gòu)體類型,包含了標(biāo)準(zhǔn) IO 為管理文件所需要的所有信息,包括文件描述符、指向文件緩沖區(qū)的指針、緩沖區(qū)的長(zhǎng)度,當(dāng)前緩沖區(qū)中的字節(jié)數(shù)以及出錯(cuò)標(biāo)志等。該類型定義在stdio.h

3. 標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤

標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出通常指的就是鍵盤和顯示器,標(biāo)準(zhǔn)錯(cuò)誤也是通過顯示器顯示的。
通過標(biāo)準(zhǔn)輸入設(shè)備與系統(tǒng)進(jìn)行交互時(shí),進(jìn)程將從標(biāo)準(zhǔn)輸入 (stdin) 文件中獲取數(shù)據(jù),將正常輸出數(shù)據(jù)輸出到標(biāo)準(zhǔn)輸出 (stdout) 文件,將錯(cuò)誤信息輸出到標(biāo)準(zhǔn)錯(cuò)誤 (stderr) 文件中。標(biāo)準(zhǔn)輸出文件和標(biāo)準(zhǔn)錯(cuò)誤文件都對(duì)應(yīng)終端的屏幕,而標(biāo)準(zhǔn)輸入文件則對(duì)應(yīng)于鍵盤。

4. fopen() 和 flose()

#include <stdio.h>
int flose(FILE *stream);// 成功返回0,失敗返回-1
FILE *fopen(const char *path, const cchar *mode);// 成功返回FILE文件指針,失敗返回NULL
/* 參數(shù):* path: 文件路徑,可以是相對(duì)路徑,也可以是絕對(duì)路徑* mode: 文件權(quán)限,是一個(gè)字符串* r:只讀* r+:可讀可寫* w:只寫,如果文件存在,就將文件截?cái)酁?,否則就創(chuàng)建文件* w+:可讀可寫方式打開文件,如果存在就截?cái)酁?,否則就創(chuàng)建文件* a:只寫,默認(rèn)是追加式寫入,如果文件不存在就創(chuàng)建文件* a+:可讀可寫,以追加的方式寫入,如果文件不存在就創(chuàng)建文件* /
// 如果文件不存在就會(huì)創(chuàng)建文件,新文件的默認(rèn)權(quán)限是0666

5. fread() 和 fwrite()

#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream);
/* 參數(shù):* ptr:存放讀取到的數(shù)據(jù)或者需要寫入的數(shù)據(jù)的緩沖區(qū)* size:讀取或?qū)懭氲臄?shù)據(jù)大小的單位,那么總共數(shù)據(jù)的大小是size*nmemb* nmemb:讀取或?qū)懭氲臄?shù)據(jù)個(gè)數(shù)* stream:FILE指針*/

6. fseek 定位

#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
// 這里的后兩個(gè)參數(shù)和lseek相同,成功返回0,失敗返回-1
long ftell(FILE *stream);
// 獲取當(dāng)前讀寫位置偏移量

7. 檢查或復(fù)位狀態(tài)

fread() 讀取數(shù)據(jù)時(shí),如果返回值小于 nmemb,表示發(fā)生了錯(cuò)誤或者已經(jīng)讀到了文件末尾,但是不能具體確定是哪種情況,可以通過判斷錯(cuò)誤標(biāo)志或 end-of-file 標(biāo)志來確定具體情況

7.1 feof()

用于測(cè)試文件的 end-of-file 標(biāo)志,如果被設(shè)置了,則調(diào)用 feof() 函數(shù)將返回一個(gè)非零值,如果沒有被設(shè)置就返回0.

#include <stdio.h>
int feof(FILE *stream);
// 當(dāng)文件的讀寫位置到結(jié)尾時(shí),end-of-file 會(huì)被設(shè)置

7.2 ferrof()

用于測(cè)試文件的錯(cuò)誤標(biāo)志,如果錯(cuò)誤標(biāo)注被設(shè)置,返回非零值,否則返回 0.

#include <stdio.h>
int ferror(FILE *stream);

7.3 clearerr()

用于清除 end-of-file 或錯(cuò)誤標(biāo)志,當(dāng)調(diào)用上面兩個(gè)函數(shù)校驗(yàn)完之后,通常需要清除這些標(biāo)志,避免下次校驗(yàn)時(shí)使用到的是上一次的值。對(duì)于 end-of-file,除了顯示清除外,調(diào)用 fseek 會(huì)自動(dòng)清除

#include <stdio.h>
void clearerr(FILE *stream);

8. 格式化 IO

8.1 格式化輸出

#include <stdio.h>
int print(const char *format,...);
int fprintf(FILE *stream, const char *format,...);
int dprintf(int fd, const char *format,...);
int sprintf(char *buf, const char *format,...);
int snprintf(char *buf, size_t size, const char *format,...);
// format:格式化控制字符串,用于指定后續(xù)的參數(shù)如何進(jìn)行格式轉(zhuǎn)換
fprintf(stderr,"hello world\n");
fprintf(stderr,"%d\n",5);dprintf(STDERR_FILENO,"hello world\n");
dprintf(STDERR_FILENO,"%d\n",5);char buf[100];
sprintf(buf,"hello world\n");
sprintf(buf,"%d",100);// 將整形轉(zhuǎn)換為字符串,并且自動(dòng)在末尾加上一個(gè)終止符// 因?yàn)閟prinf可能會(huì)發(fā)生緩沖區(qū)溢出,就引入了snprintf
// size規(guī)定了緩沖區(qū)的大小,如果寫入到緩沖區(qū)的字節(jié)數(shù)大于size,超出的部分就會(huì)丟棄

format:%[flags][width][.precision][length]type
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

8. 2 格式化輸入

#include <stdio.h>
int scanf(const char *format,...);
int fscanf(FILE *stream, const char *format,...);
int sscanf(const char *str, const char *format,...);
int a,b,c;
scanf("%d%d%d", &a&b&c);
// 使用該函數(shù)時(shí),進(jìn)程會(huì)被阻塞,直到鍵盤有數(shù)據(jù)輸入int a2,b2,c2;
fscanf(stdin,"%d%d%d",&a2,&b2,&c2);char *str="5454 hello";
char buf[10];
int a3;
sscanf(str, "%d%s",&a,buf);

format:%[*][width][ength]type%[m][width][ength]type
如果添加了 *,格式化輸入函數(shù)會(huì)按照轉(zhuǎn)換說明的指示讀取輸入,但是丟棄輸入,意味著不需要對(duì)轉(zhuǎn)換后的結(jié)果進(jìn)行存儲(chǔ),所以也就不需要提供相應(yīng)的指針參數(shù)。如果添加了 m,就只能與%s、 %c 以及%[一起使用,調(diào)用者無需分配相應(yīng)的緩沖區(qū)來保存格式轉(zhuǎn)換后的數(shù)據(jù),原因在于添加了 m,這些格式化輸入函數(shù)內(nèi)部會(huì)自動(dòng)分配足夠大小的緩沖區(qū),并將緩沖區(qū)的地址值通過與該格式轉(zhuǎn)換相對(duì)應(yīng)的指針參數(shù)返回出來,該指針參數(shù)應(yīng)該是指向 char*變量的指針。隨后,當(dāng)不再需要此緩沖區(qū)時(shí),調(diào)用者應(yīng)調(diào)用 free() 函數(shù)來釋放此緩沖區(qū)。

9. IO 緩沖

9.1 文件 IO 的內(nèi)核緩沖

文件 IO 在進(jìn)行文件讀寫操作時(shí)并不會(huì)直接訪問磁盤設(shè)備,而是僅僅在用戶空間緩沖區(qū)和內(nèi)核緩沖區(qū)之間復(fù)制數(shù)據(jù),也就是說系統(tǒng)調(diào)用和磁盤操作不是同步的。當(dāng)多個(gè)線程同時(shí)向文件寫入數(shù)據(jù)時(shí),就會(huì)將文件存放在緩沖區(qū)中,然后只進(jìn)行依次和磁盤的 IO 操作。

9.2 刷新文件 IO 的內(nèi)核緩沖區(qū)

強(qiáng)制將文件 IO 的內(nèi)核緩沖區(qū)中緩存的數(shù)據(jù)刷新到磁盤設(shè)備中

9.2.1 控制文件 IO 內(nèi)核緩沖的系統(tǒng)調(diào)用

#include <unistd.h>
int fsync(int fd);
int fdatasync(int fd);
void sync(void);// 不是對(duì)某個(gè)指定的文件數(shù)據(jù)進(jìn)行更新,而是刷新所有文件 IO 內(nèi)核緩沖區(qū)

9.2.1 控制文件 IO 內(nèi)核緩沖的標(biāo)志

fd=open(filepath,O_WRONLY|O_DSYNC);		// 類似在每個(gè)write后調(diào)用fdatasync函數(shù)
fd=ofen(filepath,O_WRONLY|O_SYNC);		// 每個(gè)write都會(huì)自動(dòng)將文件內(nèi)容數(shù)據(jù)和元數(shù)據(jù)刷新

9.3 直接 IO,繞過內(nèi)核緩沖

fd=open(filepath,O_WRONLY|O_DIRECT);

9.3.1 直接 IO 的對(duì)齊限制

  • 應(yīng)用程序中用于存放數(shù)據(jù)的緩沖區(qū),其內(nèi)存起始地址必須以塊大小的整數(shù)倍進(jìn)行對(duì)齊
  • 寫文件時(shí),文件的位置偏移量必須是塊大小的整數(shù)倍
  • 寫入到文件的數(shù)據(jù)大小必須是塊大小的整數(shù)倍
    確認(rèn)塊大小指令df -h查看 Ubuntu 系統(tǒng)的跟文件系統(tǒng)所掛載的磁盤分區(qū),接著sudo tune2fs -l /dev/sda1 | grep "Block size"

9.3.2 直接 IO 與普通 IO 對(duì)比

直接 IO 每次都是直接對(duì)磁盤發(fā)起操作,而普通方式只是將用戶空間下的數(shù)據(jù)拷貝到文件 IO 內(nèi)核緩沖區(qū)中。直接 IO 效率、性能低,只有一些特殊場(chǎng)合用到

9.4 stdio 緩沖

標(biāo)準(zhǔn) IO 效率比 文件 IO 高的根本就是它維護(hù)了自己的緩沖區(qū),減少了和磁盤的交互

9.4.1 設(shè)置 stdio 緩沖

9.4.1.1 setvbuf()
#include <stdio.h>
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
// 如果 buf 不為 NULL,那么buf指向size大小的內(nèi)存區(qū)域?qū)⒆鳛樵撐募膕tdio緩沖區(qū),所以buf應(yīng)該以動(dòng)態(tài)分配或靜態(tài)的方式在堆上開辟空間,而不是在棧上的函數(shù)內(nèi)分配局部變量。如果buf為NULL,那么stdio庫會(huì)自動(dòng)分配一塊空間作為該文件的stdio緩沖區(qū),除非mode配置為非緩沖區(qū)模式
/* mode:指定緩沖區(qū)的緩沖類型* _IONBF:不對(duì) IO 進(jìn)行緩沖。每個(gè)標(biāo)準(zhǔn)IO函數(shù)將立即調(diào)用write或read,并且忽略buf和size參數(shù),可以指定為NULL和0,stderr就是這類* _IOLBF:采用行緩沖,遇到換行符才會(huì)執(zhí)行文件IO操作。對(duì)于輸出流,在輸出一個(gè)換行符前將數(shù)據(jù)緩存(除非緩沖區(qū)已經(jīng)被填滿), 當(dāng)輸出換行符時(shí),再將這一行數(shù)據(jù)通過文件 I/O write()函數(shù)刷入到內(nèi)核緩沖區(qū)中;對(duì)于輸入流, 每次讀取一行數(shù)據(jù)。 對(duì)于終端設(shè)備默認(rèn)采用的就是行緩沖模式,譬如標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出。* _IOFBF: 采用全緩沖 I/O。 在這種情況下,在填滿 stdio 緩沖區(qū)后才進(jìn)行文件 I/O 操作(read、 write)。對(duì)于輸出流,當(dāng) fwrite 寫入文件的數(shù)據(jù)填滿緩沖區(qū)時(shí),才調(diào)用 write()將 stdio 緩沖區(qū)中的數(shù)據(jù)刷入內(nèi)核緩沖區(qū);對(duì)于輸入流, 每次讀取 stdio 緩沖區(qū)大小個(gè)字節(jié)數(shù)據(jù)。 默認(rèn)普通磁盤上的常規(guī)文件默認(rèn)常用這種緩沖模式*/
// size指定緩沖區(qū)大小

當(dāng) stdio 緩沖區(qū)中的數(shù)據(jù)被刷入到內(nèi)核緩沖區(qū)或被讀取之后,這些數(shù)據(jù)就不會(huì)存在于緩沖區(qū)中了,數(shù)據(jù)被刷入了內(nèi)核緩沖區(qū)或被讀走了

9.4.1.2 setbuf()
#include <stdio.h>
void setbuf(FILE *stream, char *buf);

執(zhí)行和 setvbuf 類似的任務(wù)

9.4.1.3 setbuffer()
#include <stdio.h>
void setbuffer(FILE *stream, char *buf, size_t size);

和setbuf類似,但是可以指定緩沖的大小

9.4.2 緩沖模式

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{// setvbuf(stdout, NULL, _IONBF, 0);// 將stdout設(shè)置為無緩沖printf("Hello World!\n");printf("Hello World!");for ( ; ; )sleep(1);
}

上面的代碼只能看到第一個(gè)打印信息,第二個(gè)看不到,因?yàn)榈谝粋€(gè)是行緩沖,而第二個(gè)是全緩沖,只有當(dāng)程序結(jié)束會(huì)刷新緩沖區(qū)。如果去掉注釋,那么兩個(gè)都可以打印出來。

9.4.3 刷新 stdio 緩沖區(qū)

#include <stdio.h>
int fflush(FILE *stream);	// 刷新緩沖區(qū)
int fclose(FILE *stream);	// 關(guān)閉緩沖區(qū)

強(qiáng)制刷新緩沖區(qū),如果 stream 為 NULL,就表示刷新所有 stdio 緩沖區(qū)。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{printf("Hello World!\n");printf("Hello World!");fflush(stdout);// fclose(stdout);for ( ; ; )sleep(1);
}

上面代碼一樣可以看到兩個(gè)打印信息。同樣,關(guān)閉文件也可以刷新緩沖區(qū)

10. 文件描述符和FILE指針互轉(zhuǎn)

有時(shí)需要將文件 IO 和標(biāo)準(zhǔn) IO 混合使用

#include <stdio.h>
int fileno(FILE *stream);
FILE *fdopen(int fd, const char *mode);

當(dāng)混合使用時(shí),需要注意緩沖的問題,文件 IO 會(huì)直接將數(shù)據(jù)寫入到內(nèi)核緩沖區(qū)進(jìn)行高速緩存,而標(biāo)準(zhǔn) IO 會(huì)將數(shù)據(jù)寫入到 stdio 緩沖區(qū),之后再調(diào)用 write() 將 stdio 緩沖區(qū)中的數(shù)據(jù)寫入到內(nèi)核緩沖區(qū)。比如:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main()
{printf("print");write(STDOUT_FILENO,"write\n",6);exit(0);
}
// 這里先輸出了write的內(nèi)容,然后再輸出print的內(nèi)容,因?yàn)閜rint沒有遇到換行符,也就是清除緩沖區(qū),只有等到運(yùn)行結(jié)束之后才清理
http://aloenet.com.cn/news/31535.html

相關(guān)文章:

  • 縱橫中文網(wǎng)關(guān)鍵詞優(yōu)化收費(fèi)標(biāo)準(zhǔn)
  • 衡水網(wǎng)站建設(shè)費(fèi)用長(zhǎng)沙網(wǎng)站推廣公司排名
  • 政府網(wǎng)站建設(shè)如何做seo站長(zhǎng)助手
  • 豐臺(tái)區(qū)社會(huì)建設(shè)網(wǎng)站比較有名的個(gè)人網(wǎng)站
  • 主題資源網(wǎng)站建設(shè)步驟推廣網(wǎng)站平臺(tái)
  • 河南省建設(shè)廳網(wǎng)站官網(wǎng)營銷推廣技巧
  • 行業(yè)門戶網(wǎng)站如何做永久免費(fèi)個(gè)人網(wǎng)站注冊(cè)
  • 做爰全過程免費(fèi)的視網(wǎng)站頻外包網(wǎng)絡(luò)推廣公司
  • 做網(wǎng)站優(yōu)化用什么軟件微信引流用什么軟件好用
  • 網(wǎng)站建立網(wǎng)站百度推廣的渠道有哪些
  • 怎么做彩票網(wǎng)站收款人網(wǎng)站排名點(diǎn)擊工具
  • 如何制作一個(gè)注冊(cè)網(wǎng)站建個(gè)網(wǎng)站需要多少錢
  • 寧波網(wǎng)站建設(shè)制作哪家好百度公司地址
  • 網(wǎng)站托管公司站長(zhǎng)工具外鏈查詢
  • 給網(wǎng)站劃分欄目怎么做百度關(guān)鍵詞排名
  • 做網(wǎng)站用什么框架好怎么引流怎么推廣自己的產(chǎn)品
  • 公司網(wǎng)站郵箱費(fèi)用熱搜詞排行榜關(guān)鍵詞
  • 鄭州建站價(jià)格手機(jī)百度app下載安裝
  • Wordpress 視頻采集插件電商seo優(yōu)化是什么意思
  • 漳州微網(wǎng)站建設(shè)公司推薦百度廣告聯(lián)系方式
  • 網(wǎng)站建設(shè)多長(zhǎng)時(shí)間能學(xué)會(huì)做網(wǎng)站平臺(tái)需要多少錢
  • 怎么查詢網(wǎng)站備案培訓(xùn)學(xué)校怎么招生
  • 如何做直播做菜視頻網(wǎng)站關(guān)鍵詞優(yōu)化排名
  • 西鄉(xiāng)網(wǎng)站開發(fā)長(zhǎng)沙seo關(guān)鍵詞排名
  • 工藝品做網(wǎng)站網(wǎng)絡(luò)推廣公司
  • wordpress指定用戶隱藏分類廣州seo站內(nèi)優(yōu)化
  • 鄭州做網(wǎng)站推廣價(jià)格徐州seo排名收費(fèi)
  • 廣州網(wǎng)站設(shè)計(jì)出名 樂云踐新正規(guī)推廣平臺(tái)有哪些
  • 外貿(mào)手機(jī)網(wǎng)站seo標(biāo)題優(yōu)化的心得總結(jié)
  • 網(wǎng)站設(shè)計(jì)實(shí)例搜狗快速收錄方法