亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統(tǒng) > Unix > 正文

UNIX高級環(huán)境編程(7)標(biāo)準(zhǔn)IO函數(shù)庫

2024-06-28 13:21:44
字體:
供稿:網(wǎng)友
UNIX高級環(huán)境編程(7)標(biāo)準(zhǔn)IO函數(shù)庫 - 二進制文件IO,流定位,創(chuàng)建臨時文件和內(nèi)存流

1 二進制IO(Binary IO)

在前一篇我們了解了逐字符讀寫和逐行讀寫函數(shù)。

如果我們在讀寫二進制文件,希望以此讀寫整個文件內(nèi)容,這兩個函數(shù)雖然可以實現(xiàn),但是明顯會很麻煩且多次循環(huán)明顯效率很低。

為了應(yīng)對這種場景,標(biāo)準(zhǔn)IO庫提供了fread和fwrite函數(shù)。

函數(shù)聲明:

#include <stdio.h>

size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp);

size_t fwrite(const void *restrict ptr, size_t size size_t nobj, FILE *restrict fp);

函數(shù)用法;

a) 讀寫一個數(shù)組。

float data[10];

if (write(&data[2], sizeof(float), 4, fp) != 4)

? ? err_sys(“fwrite error");

本例中,從流fp中讀取4個float型數(shù)據(jù)填入到數(shù)組下表從2到5得位置中。

b) 讀寫一個結(jié)構(gòu)體

struct {

? ? short ?count;

? ? long ? total;

? ? char ? name[NAMESIZE];

} item;

if (fwrite(&item, sizeof(item), 1, fp) != 1)

? ? err_sys(“fwrite error");

本例中,從fp讀取數(shù)據(jù)填入到一個結(jié)構(gòu)體中。

?

上面兩例都可以認(rèn)為是讀寫一個結(jié)構(gòu)體的數(shù)組,參數(shù)size是結(jié)構(gòu)體的長度,參數(shù)nobj是數(shù)組中要讀寫的元素的個數(shù)。

?

函數(shù)返回值:

兩個函數(shù)的返回值都是讀寫的元素個數(shù)。

對于讀函數(shù),返回值可能會比nobj小,如果有異常拋出或者讀到了文件結(jié)尾。這時需要調(diào)用函數(shù)ferror或feof來判斷。

對于寫函數(shù),返回值比nobj小,則一定是有異常拋出。

?

函數(shù)細(xì)節(jié):

在上面的例子中,我們通過fwrite函數(shù)填充了一個結(jié)構(gòu)體,那么如果讀寫不在一個系統(tǒng)中,那么結(jié)構(gòu)體的內(nèi)存布局可能并不相同,這對于現(xiàn)在的多系統(tǒng)互聯(lián)工作的場景下很常見。我們會在討論socket時回來繼續(xù)看這個問題,實際的解決方案就是在不同系統(tǒng)間讀寫二進制數(shù)據(jù)時使用相同的協(xié)議。

?

2 定位流(Positioning a Stream)

我們有三種方法對流進行定位:

  • 函數(shù)ftell和fseek。將文件的當(dāng)前偏移位置存儲在long integer型變量中;
  • 函數(shù)ftello和fseeko。將文件的當(dāng)前偏移量存儲在off_t型變量中;
  • 函數(shù)fgetpos和fsetpos。使用數(shù)據(jù)類型fpos_t記錄文件的當(dāng)前偏移量。

?

ftell和fseek函數(shù)聲明:

#include <stdio.h>

long ftell(FILE* fp); ? ?// Returns:current file position indicator if OK, -1L on error

int fseek(FILE* fp, long offset, int whence); ? ? ? // Returns:0 if OK , -1 on error

void rewind(FILE* fp);

函數(shù)細(xì)節(jié):

  • 二進制文件的偏移量是從文件開始到當(dāng)前位置的字節(jié)數(shù);
  • ftell函數(shù)返回當(dāng)前文件的偏移位置;
  • fseek函數(shù)用來定位文件到指定偏移位置;
  • fseek函數(shù)的參數(shù)whence,用來設(shè)置計算偏移量的方法:SEEK_SET表示從文件開頭開始計算,SEEK_CUR表示從文件當(dāng)前偏移位置開始計算,SEEK_END表示從文件結(jié)尾開始計算。
  • 對于一些非Unix操作系統(tǒng),存儲文本文件的存儲格式會有所不同,當(dāng)前文件偏移量無法通過字節(jié)數(shù)來表示,這種情況下,參數(shù)whence需要設(shè)置為SEEK_SET,并且offset只有兩個值可以使用:0,表示倒回文本開頭;另一個可用值為函數(shù)ftell的返回值。

?

ftello和fseeko函數(shù)聲明:

#include <stdio.h>

off_t ftello(FILE* fp); ? ? // Returns: current file position indicator if OK, (off_t) -1 on error

int fseeko(FILE* fp, off_t offset, int whence); ? ? /// Returns: 0 if OK, -1 on error

函數(shù)細(xì)節(jié):

  • 這兩個函數(shù)和上面的ftell和fseek功能相同,只是返回值類型不是long,而改成了off_t,實現(xiàn)上可以讓off_t的表示范圍更大。

?

fgetpos和fsetpos函數(shù)聲明:

#include <stdio.h>

int fgetpos(FILE* restrict fp, fpos_t *restrict pos);

int fsetpos(FILE* fp, const fpos_t pos);

函數(shù)細(xì)節(jié):

  • fgetpos函數(shù)保存當(dāng)前文件偏移量到參數(shù)pos中
  • fgetpos得到的pos可以用來使用fsetpos設(shè)置當(dāng)前文件偏移量到之前的位置。

?

3 格式化輸入輸出格式化輸出函數(shù)

有五個PRintf函數(shù)負(fù)責(zé)格式化輸出。

函數(shù)聲明:

#include <stdio.h>

int printf(const char *restrict format, ...);

int fprintf(FILE *restrict fp, const char *restrict format, ...);

int dprintf(int fd, const char *restrict format, ..);

? ? ? // All three return : number of characters output if OK , negative value if output error

int sprintf(char *resrict buf, const char *restrict format, ...);

? ? ? // Returns: number of characters stored in array if OK, negative value if encoding error

int snprintf(char *restrict buf, size_t n, const char *restrict format, ...);

? ? ? // Returns: number of characters,that would have been stored in array if buffer was large enough, negative value if encoding error

函數(shù)細(xì)節(jié):

  • printf輸出到標(biāo)準(zhǔn)輸出;
  • fprintf輸出到指定的流中;
  • dprintf輸出到指定的文件描述符中;
  • sprintf將格式化字符串寫入到指定的buffer數(shù)組中,自動在結(jié)尾處加上一個null結(jié)尾符,但是不計入返回值中,并且,sprintf在buffer不夠大時可能發(fā)生越界,因此需要使用者保證buffer足夠大;
  • snprintf防止越界,在springf的參數(shù)中增加了buffer的大小參數(shù),所有越界寫入的字符都被忽略,如果返回值比buffer得長度要小,則說明輸出沒有被截斷。

?

格式化輸入函數(shù)

函數(shù)聲明:

#include <stdio.h>

int scanf(const char *restrict format, ...);

int fscanf(FILE *restrict fp, const char *restrict format, ...);

int sscanf(const char *restrict buf, const char *restrict format, ...);

函數(shù)細(xì)節(jié):

  • format參數(shù)后面接得參數(shù),包含存放讀入字符串的變量地址。

更多關(guān)于格式化輸入輸出的細(xì)節(jié)可以自己查詢Unix操作系統(tǒng)手冊。

?

4 從流中獲取文件描述符

函數(shù)聲明:

#include <stdio.h>

int fileno(FILE* fp); ? ? ? // Returns: the file descriptor associated with the stream

如果我們需要調(diào)用dup和fcntl,則需要調(diào)用該函數(shù)。

?

5 臨時文件(Temporary Files)

標(biāo)準(zhǔn)IO庫提供了兩個函數(shù)用于創(chuàng)建臨時文件。

函數(shù)聲明:

#include <stdio.h>

char* tempnam(char *ptr);

FILE* tmpfile(void);

函數(shù)細(xì)節(jié):

  • 函數(shù)tmpnam生成一個字符串,該字符串為一個合法的路徑名,并且不和任何已存在的文件重復(fù)。
  • 函數(shù)tmpnam每次調(diào)用都生成不同的字符串,知道TMP_MAX次數(shù)。
  • 如果函數(shù)tempnam的參數(shù)ptr為NULL,則生成的路徑字符串存在內(nèi)存靜態(tài)區(qū),函數(shù)返回值為指向該路徑字符串的指針。如果隨后再次使用null參數(shù)調(diào)用tempnam,會覆蓋之前生成的字符串。
  • 如果函數(shù)tempnam的參數(shù)ptr不是NULL,那么生成的路徑字符串存在ptr指向的數(shù)組內(nèi),所以需要保證ptr指向的數(shù)組的長度至少為L_tmpnam。
  • 函數(shù)tmpfile函數(shù)創(chuàng)建一個臨時二進制文件(type wb+),程序終止或者該文件被關(guān)閉,則該文件自動被刪除。對于UNIX操作系統(tǒng)而言,生成一個二進制文件并沒有什么影響,因為內(nèi)核并不區(qū)分文本文件還是二進制文件。

Example:

Code:

#include?"apue.h"

?

int

main(void)

{

? ??char? ? name[L_tmpnam], line[MAXLINE];

? ??FILE? ? *fp;

?

? ? printf("%s/n", tmpnam(NULL)); ? ? ??/* first temp name */

?

? ? tmpnam(name); ? ? ? ? ? ? ? ? ? ? ??/* second temp name */

? ? printf("%s/n", name);

?

? ??if?((fp = tmpfile()) ==?NULL) ? ? ??/* create temp file */

? ? ? ? err_sys("tmpfile error");

? ? fputs("one line of output/n", fp);??/* write to temp file */

? ? rewind(fp); ? ? ? ? ? ? ? ? ? ? ? ??/* then read it back */

? ??if?(fgets(line,?sizeof(line), fp) ==?NULL)

? ? ? ? err_sys("fgets error");

? ? fputs(line,?stdout);? ? ? ? ? ? ? ??/* print the line we wrote */

?

? ? exit(0);

}

?

在系統(tǒng)The Single UNIX Specification定義了另外兩個函數(shù)處理臨時文件:

函數(shù)聲明:

char* mkdtemp(char* template); ? ?// Returns: pointer to directory name if OK, NULL on error

int mkstemp(char* template); ? ?// Returns: file descriptor if OK, -1 on error

函數(shù)細(xì)節(jié):

  • mkdtemp函數(shù)創(chuàng)建一個名字唯一的文件夾
  • mkstemp函數(shù)創(chuàng)建一個名字唯一的常規(guī)文件(regular file)
  • 命名規(guī)則為 template + 六位隨機字符

?

6 內(nèi)存流(Memory Streams)

有的標(biāo)準(zhǔn)輸入輸出流并沒有對應(yīng)打開的硬盤文件,所有操作都是與內(nèi)存中buffer進行數(shù)據(jù)交換,這些流被叫做內(nèi)存流(memory streams)。

函數(shù)聲明:

#include <stdio.h>

FILE* fmemopen(void *restrict buf, size_t size, const char *restrict type);

// Returns: stream pointer if OK, NULL on error

函數(shù)細(xì)節(jié):

  • 參數(shù)buf指定使用的buffer,size為該buffer的大小,如果只指定size,而buf為null,那么fmemopen根據(jù)size的大小分配內(nèi)存,由fmemopen分配的內(nèi)存在流關(guān)閉時自動被釋放;
  • 參數(shù)type控制該流的功能.

?

7 總結(jié)

標(biāo)準(zhǔn)IO函數(shù)庫被大多數(shù)UNIX應(yīng)用使用。

在使用的時候,注意哪里使用了buffer來處理,因為這是容易引起迷惑的地方。

?

?

參考資料:

《Advanced Programming in the UNIX Envinronment 3rd》

?


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
日本无删减在线| 欧美精品一区二区三区三州| 国产一级黄色录像| av在线亚洲天堂| 欧美日韩久久久久| 免费男女羞羞的视频网站中文字幕| 亚洲第一成人在线| 在线观看网站免费入口在线观看国内| 天天综合网天天综合色| 羞羞视频在线观看欧美| 99草草国产熟女视频在线| 日韩一级视频免费观看在线| 久久久国产精品一区| 丝袜美女在线观看| 91在线视频观看免费| 黄网站免费入口| 欧美激情在线观看视频免费| 中文字幕求饶的少妇| 欧美激情www| 国产精品第一视频| 欧美不卡1区2区3区| 久久久久亚洲av无码专区首jn| 2014亚洲片线观看视频免费| 欧美激情免费观看| 免费观看的av| 久久精品一区二区三区四区五区| 欧美日韩在线精品成人综合网| 国产深夜精品福利| 水蜜桃av无码| 亚洲成年电人电影网站| av不卡高清| 成人免费区一区二区三区| 中文字幕日产av一二三区| 欧美高清在线一区| 亚洲影院免费观看| 亚洲一区二区三区在线观看视频| 日本午夜精品久久久| 91国拍精品国产粉嫩亚洲一区| 91中文字幕在线视频| 久久久久欧美| 久久久久一区二区三区| 91丨九色丨海角社区| 在线欧美亚洲| 日韩精品欧美激情一区二区| 日韩欧美一中文字暮专区| 懂色aⅴ精品一区二区三区| 九九热在线免费观看| 2019最新中文字幕| 欧美日韩久久久久久| a级免费视频| 国产成人无码aa精品一区| 制服丝袜在线播放| 美女撒尿一区二区三区| www.久久91| 国产久一一精品| 亚洲精品传媒| 婷婷精品国产一区二区三区日韩| 牛牛精品一区二区| 99久久国产综合精品成人影院| 亚洲一区二区不卡免费| 国产亚洲欧洲在线| 美美哒免费高清在线观看视频一区二区| 亚洲av无码精品一区二区| 任你弄在线视频免费观看| 欧美精品大片| 久久99久久98精品免观看软件| 在线看女人毛片| 亚洲黄色免费观看| 蜜桃在线一区二区三区精品| 亚洲欧洲视频| 成人免费一区二区三区在线观看| 奇米狠狠一区二区三区| 亚洲第一网中文字幕| 欧美视频免费看欧美视频| 天天爽夜夜爽夜夜爽精品| 国产jizz18女人高潮| 成人亚洲一区二区一| 久久久精品久久久久久96| 欧美亚洲日本在线观看| 亚洲自拍欧美另类| 内射毛片内射国产夫妻| 影音先锋中文字幕一区| 91涩漫在线观看| 女人天堂av在线播放| 91精品国产综合久久男男| 99视频一区二区三区| 精品久久久影院| 好看的日韩精品视频在线| 黄色18在线观看| 成人国产精品久久| 在线观看av中文| 开心激情综合网| 不卡高清视频专区| 91wwwcom在线观看| 一边摸一边做爽的视频17国产| 天天色天天射天天干| 极品中文字幕一区| 999精品在线视频| 精品91久久久| 激情综合亚洲精品| 在线看片中文字幕| 日本欧美高清| 国偷自产av一区二区三区| 波多野结衣免费观看| 中文字幕在线看精品乱码| 91福利精品第一导航| 欧美亚洲系列| 久久精子c满五个校花| 狠狠激情五月综合婷婷俺| 黑人狂躁日本妞一区二区三区| 欧美亚洲自偷自偷| 成人情趣视频网站| 亚洲自拍在线观看| 欧洲一区二区三区精品| 国产一区免费在线| 欧美精品免费看| 日韩欧美一起| 国产成人久久精品麻豆二区| 亚洲国产精品久久久久久6q| 亚洲欧美另类在线观看| 天天草夜夜草| 亚洲欧洲国产伦综合| 国产乱码精品一区二区三区卡| 日本免费高清一区| 日韩欧美一级精品久久| 欧美大香线蕉线伊人久久| 欧美日韩夫妻久久| 高清国产一区二区三区四区五区| 91社区在线观看| 蜜桃一区二区三区在线| 有色视频在线观看| 亚洲乱码中文字幕久久孕妇黑人| 久久久精品国产免大香伊| 日韩一级免费看| 中国色在线日|韩| 93在线视频精品免费观看| 国产欧美精品久久久| 精品少妇av| 成人免费视频视频| 蜜臀av国内免费精品久久久夜夜| 六月天色婷婷| 国精产品一区一区三区免费视频| 亚洲视频在线不卡| 视频在线99re| 精品国产午夜| 国产一区二区三区朝在线观看| 日韩天堂在线视频| www日本在线| 美国一级片在线免费观看视频| 11024精品一区二区三区日韩| 国产三级在线观看视频| 天天久久综合| 老熟妇高潮一区二区高清视频| 黄色一级视频免费看| 精品亚洲一区二区| 久久精品免费观看| 视频在线一区| 成人免费一区二区三区在线观看| 欧美黑人xxxⅹ高潮交| 性生活三级视频| 亚洲无限av看| 精品国产一区久久久| 欧美成人免费网站| 日韩欧美字幕| 国产精品不卡一区二区三区在线观看| 国产精品69毛片高清亚洲| 小小水蜜桃在线观看| 欧美岛国在线观看| 亚洲成人av中文字幕| 综合激情五月婷婷| 国产精品区二区三区日本| 欧美日韩国产一区二区三区| 自由色视频.| 天天操天天爽天天干| 欧美中文字幕一区二区三区亚洲| 中文字幕亚洲不卡| 欧美+日本+国产+在线a∨观看| 新婚的少妇hd中文字幕| 97影院秋霞午夜在线观看| 日本欧美视频在线观看| 国产一区视频在线播放| 国产精品第6页| 色是在线视频| 欧美一级爽aaaaa大片| 国语自产精品视频在线看抢先版结局| 最近中文字幕免费mv2018在线| 国产卡一卡2卡三卡免费视频| 苍井空浴缸大战猛男120分钟| 无码人妻一区二区三区免费n鬼沢| 日韩激情综合| 韩国精品一区二区三区六区色诱| 日本午夜一区二区三区| 国产一区二区三区精品在线| 高清视频一区二区三区四区| 国产日韩欧美激情| 精品久久久久久无码国产| 亚洲九九视频| 中文字幕在线直播| 日日噜噜噜噜夜夜爽亚洲精品| 一区二区蜜桃| 国产精品一品二品| 国自在线精品视频| 精品国产乱码久久久久久浪潮| 久久天天躁狠狠躁老女人| 国产日韩一区二区三免费高清| 亚洲乱码av中文一区二区| 欧美自拍小视频| 欧美成人首页| 欧美亚洲另类视频| 精品福利影视| 亚洲精品影视在线| 欧美电影《轻佻寡妇》| 88av.com| 在线手机中文字幕| 欧美日韩国产一二三区| 成人3d动漫一区二区三区91| 天天影院图片亚洲| av电影在线网站| 久久久成人精品视频| 91狠狠综合久久久久久| 成人精品久久一区二区三区| 日本成人免费网站| 中文字幕亚洲欧美一区二区三区| 99re热这里只有精品免费视频| 老司机福利在线视频| 韩日中文字幕第一页| 毛片久久久久久| 亚洲aa在线观看| 在线观看av影片| 国产欧美一区二区三区精品观看| 日本免费网站| 国产一区二区高清在线| 亚洲国产精品成人综合| 国产精品旅馆在线| 亚洲精品成人电影| 亚洲精品中文字幕乱码无线| 香蕉视频禁止18| 78m国产成人精品视频| 国产亚洲一区精品| 欧美一级精品在线| 国产一区不卡在线| 国产一级免费看| 日韩欧美在线影院| 伊人成人网在线看| 精品国产乱码一区二区三| 国产精品久久久999| 国内精品小视频| 精品卡一卡二卡三卡四在线| 红桃一区二区三区| 成人亚洲精品777777大片| 亚洲精品女人久久久| 欧美激情网站| 欧美放荡办公室videos4k| 亚洲精品久久久狠狠狠爱| 日韩一区二区精品葵司在线| 亚洲v日韩v欧美v综合| 伊人久久亚洲综合| 免费av一区二区| 最新亚洲一区| 电影久久久久久| 日韩电影免费网站| 黄色大片网站在线观看| 日韩中文字幕在线视频观看| 久热在线视频精品网站| 国模一区二区三区私拍视频| 免费欧美激情| 国产裸体写真av一区二区| 波多野结衣亚洲一区| 超碰97在线免费观看| 精品国内二区三区| 国产网站在线| 在线亚洲精品自拍| 五月天激情婷婷| 欧美夫妻性生活视频| 久久精品国产精品国产精品污| 99久久无色码| 群体交乱之放荡娇妻一区二区| 男人天堂久久| 只有这里有精品| 日本韩国一区二区三区| 久久er这里只有精品| 日韩欧美视频网站| 久久免费播放视频| 国产av熟女一区二区三区| 国产一区调教| 亚洲综合偷拍欧美一区色| 国产欧美日韩三级| 国产美女18xxxx免费视频| 欧美日韩国产成人高清视频| 日韩一区二区在线免费| 一级α片免费看刺激高潮视频| 日韩午夜激情| 免费污视频在线一区| 污香蕉视频在线观看| 在线视频1卡二卡三卡| 亚洲精品一区二区三区婷婷月| 宅男深夜视频| 精品国产va久久久久久久| 色妞欧美日韩在线| 国产精品欧美久久久久天天影视| 天堂网在线观看国产精品| 日本成人三级电影网站| 欧美精品在线一区二区三区| 国产福利微拍精品一区二区| 九九热精品视频在线观看| 91精品国产乱码久久久久久久| 男人添女荫道口女人有什么感觉| 91精品国产色综合久久不卡98口| 日本免费高清一区| 成年人视频软件| 一区二区不卡在线播放| 欧美 日韩 中文字幕| 国产精品www994| 在线免费91| 久久精品九色| 制服 丝袜 综合 日韩 欧美| 国产综合在线看| 在线看中文字幕| 欧美亚洲爱爱另类综合| 欧美天堂一区| 久久av资源网站| 一区二区三区精品国产| 爱啪导航一精品导航站| 国产精品一二三区| 好看的av在线| 欧美黄色性生活| 最新中文字幕在线视频| 欧美怡红院视频一区二区三区|