Linux 文件IO 和 標(biāo)準(zhǔn)IO

[TOC]


Linux 文件IO 和 標(biāo)準(zhǔn)IO


Linux 文件IO

Linux中做文件IO最常用到的5個(gè)函數(shù)是: open , close , read , write 和 lseek ,不是ISO C的組成部分,這5個(gè)函數(shù)是不帶緩沖的IO姐扮,也即每個(gè)read和write都調(diào)用了內(nèi)核的一個(gè)系統(tǒng)調(diào)用广匙。

#include <fcntl.h>
#include <unistd.h>
int open(const char *pathname, int oflag, ... /* mode_t mode */);/* 成功返回文件描述符双絮, 失敗返回-1 */
int close(int filedes);/* 成功返回0器紧, 失敗返回-1 */
off_t lseek(int filedes, off_t offset, int whence);/* 成功返回新的文件偏移量邓尤,出錯(cuò)返回-1 */
ssize_t read(int filedes, void *buf, size_t nbytes);/* 成功則返回讀取到的字節(jié)數(shù)畔况,若已到文件的結(jié)尾返回0,出錯(cuò)返回-1 */
ssize_t write(int filedes, void *buf, size_t nbytes);/* 成功則返回寫入的字節(jié)數(shù)澄干,出錯(cuò)返回-1 */

Linux 標(biāo)準(zhǔn)IO

標(biāo)準(zhǔn)IO庫提供緩沖功能逛揩,減少系統(tǒng)調(diào)用柠傍。

  • 全緩沖。即填滿IO緩沖區(qū)后才進(jìn)行IO操作息尺。
  • 行緩沖携兵。遇到換行符時(shí)執(zhí)行IO操作。 * 無緩沖搂誉。

一般情況下徐紧,標(biāo)準(zhǔn)出錯(cuò)無緩沖。如果涉及終端設(shè)備炭懊,一般是行緩沖并级,否則是全緩沖。
可用 setbuf 和 setvbuf 函數(shù)設(shè)置緩沖類型已經(jīng)緩沖區(qū)大小侮腹,使用fflush函數(shù)沖洗緩沖區(qū)嘲碧。

打開流

使用 fopen , freopen , fdopen 三個(gè)函數(shù)打開一個(gè)流,這三個(gè)函數(shù)都返回FILE類型的指針父阻。

#include <stdio.h>
FILE *fopen(const char *restrict pathname, const char *restrict type);
FILE *freopen(const char *restrict pathname, const char *restrict type, FILE *restrict fp);
FILE *dopen(int filedes, const char *type);
/* 成功返回FILE類型指針愈涩,出錯(cuò)返回NULL */
  • fopen 打開一個(gè)指定的文件。
  • freopen 在一個(gè)指定的流上打開一個(gè)文件加矛,比如在標(biāo)準(zhǔn)輸出流上打開某文件履婉。
  • dopen 打開指定的文件描述符代表的文件。常用于讀取管道或者其他特殊類型的文件斟览,因?yàn)檫@些文件不能直接用fopen打開毁腿。
  • type 參數(shù)指定操作類型,入讀寫苛茂,追加等等已烤。

關(guān)閉流

fclose 函數(shù)關(guān)閉一個(gè)流:

#include <stdio.h>
int flose(FILE *fp);
/* 成功返回0,出錯(cuò)返回EOF */

讀寫流

  • 每次一個(gè)字符的IO流
#include <stdio.h>
/* 輸入 */
int getc(FILE *fp);
int fgetc(FILE *fp);
int getchar(void);
/* 上面三個(gè)函數(shù)的返回值為int妓羊,因?yàn)镋OF常實(shí)現(xiàn)為-1胯究,返回int就能與之比較 */

/* 判斷出錯(cuò)或者結(jié)束 */
int ferror(FILE *fp);
int feof(FILE *fp);
void clearerr(FILE *fp); /* 清除error或者eof標(biāo)志 */

/* 把字符壓送回流 */
int ungetc(intc FILE *fp);

/* 輸出 */
int putc(int c, FILE *fp);
int fputc(int c, FILE *fp);
int putchar(int c);
  • 每次一行的IO流
#include <stdio.h>
/* 輸入 */
char *fgets(char *restrict buf, int n, FILE *restrict fp);
char *gets(char *buf);
/* gets由于沒有指定緩沖區(qū),所以有可能造成緩沖區(qū)溢出躁绸,要小心 */

/* 輸出 */
int fputs(char *restrict buf, FILE *restrict fp);
int puts(const char *buf);
  • 二進(jìn)制讀取讀寫文件流唐片,常作為讀取打開的整個(gè)流文件
#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);
/* 返回值:讀或?qū)懙膶?duì)象數(shù) */

定位流

#include <stdio.h>
long ftell(FILE *fp);
/* 成功則返回當(dāng)前文件位置指示,出錯(cuò)返回-1L */

int fseek(FILE *fp, long offset, int whence);
/* 成功返回0涨颜, 出錯(cuò)返回非0 */

int fgetpos(FILE *restrict fp, fpos_t *restrict pos);
int fsetpos(FILE *fp, fpos_t *pos);
/* 成功返回0,出錯(cuò)返回非0 */

格式化輸出IO流

執(zhí)行格式化輸出的主要是4個(gè) printf 函數(shù):

  • printf 輸出到標(biāo)準(zhǔn)輸出
  • fprintf 輸出到指定流
  • sprintf 輸出到指定數(shù)組
  • snprintf 輸出到指定數(shù)組并在數(shù)組的尾端自動(dòng)添加一個(gè)null字節(jié)

格式化輸入IO流

格式化輸入主要是三個(gè) scanf 函數(shù):

  • scanf 從標(biāo)準(zhǔn)輸入獲取
  • fscanf 從指定流獲取
  • sscanf 從指定數(shù)組獲取
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茧球,一起剝皮案震驚了整個(gè)濱河市庭瑰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抢埋,老刑警劉巖弹灭,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件督暂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡穷吮,警方通過查閱死者的電腦和手機(jī)逻翁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捡鱼,“玉大人八回,你說我怎么就攤上這事〖菡” “怎么了缠诅?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長乍迄。 經(jīng)常有香客問我管引,道長,這世上最難降的妖魔是什么闯两? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任褥伴,我火速辦了婚禮,結(jié)果婚禮上漾狼,老公的妹妹穿的比我還像新娘重慢。我一直安慰自己,他們只是感情好邦投,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布伤锚。 她就那樣靜靜地躺著,像睡著了一般志衣。 火紅的嫁衣襯著肌膚如雪屯援。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天念脯,我揣著相機(jī)與錄音狞洋,去河邊找鬼。 笑死绿店,一個(gè)胖子當(dāng)著我的面吹牛吉懊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播假勿,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼借嗽,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了转培?” 一聲冷哼從身側(cè)響起恶导,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浸须,沒想到半個(gè)月后惨寿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體邦泄,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年裂垦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了顺囊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蕉拢,死狀恐怖特碳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情企量,我是刑警寧澤测萎,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站届巩,受9級(jí)特大地震影響硅瞧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恕汇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一腕唧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瘾英,春花似錦枣接、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至湿蛔,卻和暖如春膀曾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阳啥。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國打工添谊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人察迟。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓斩狱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扎瓶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子所踊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 文件操作 (Linux文件操作)) [文件|目錄] Linux文件操作:為了對(duì)文件和目錄進(jìn)程處理,你需要用到系統(tǒng)...
    JamesPeng閱讀 1,464評(píng)論 1 5
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,161評(píng)論 2 33
  • 一概荷、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運(yùn)行的地址不確定 關(guān)于...
    SeanCST閱讀 7,808評(píng)論 0 27
  • C/C++輸入輸出流總結(jié) 前兩天寫C++實(shí)習(xí)作業(yè)污筷,突然發(fā)現(xiàn)I/O是那么的陌生,打了好長時(shí)間的文件都沒有打開,今天終...
    LuckTime閱讀 1,731評(píng)論 0 6
  • 現(xiàn)代世界的復(fù)雜性已經(jīng)超出了人力所能控制的范圍瓣蛀,任何一個(gè)需要從業(yè)人員掌控大量知識(shí)的領(lǐng)域都難逃厄運(yùn)。從醫(yī)療到金融雷厂,從商...
    壹姐微幸福閱讀 403評(píng)論 0 1