linux 標(biāo)準(zhǔn)io筆記

三種緩沖

1.全緩沖:在緩沖區(qū)寫滿時(shí)輸出到指定的輸出端. 比如對(duì)磁盤上的文件進(jìn)行讀寫通常是全緩沖的.
2.行緩沖:在遇到'\n'時(shí)輸出到指定的輸出端. 比如標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出就是行緩沖, 回車后就會(huì)進(jìn)行相應(yīng)的I/O操作.
3.無緩沖:有什么就輸出什么. 比如標(biāo)準(zhǔn)錯(cuò)誤輸出, 出錯(cuò)時(shí)立即顯示出來.
設(shè)置緩沖方式的函數(shù)有兩個(gè)犯祠,分別為setbuf,setvbuf
可用fflush立即輸出总处,不管緩沖區(qū)是否達(dá)到輸出標(biāo)準(zhǔn)

打開、關(guān)閉

1.FILE *fopen(const char *restrict pathname, const char *restrict type)
第一個(gè)參數(shù)為文件的路徑,
第二個(gè)參數(shù)為打開的方式: r/rb只讀; w/wb只寫; a/ab添加; r+/ra+讀寫; w+/wa+讀寫; a+/ab+文件尾添加讀寫

2.int fclose(FILE *fp)
關(guān)閉打開的文件流, 釋放內(nèi)存

讀寫終止判斷

讀寫終止分兩種情況, 讀寫到文件尾正常終止, 讀寫出錯(cuò)返回
int feof(FILE *fp): 如果是正常終止, 函數(shù)返回非0(true)值
int ferror(FILE *fp): 如果是出錯(cuò)終止, 函數(shù)返回非0(true)值

每次讀寫一個(gè)字符

getc/fgetc/getchar
putc/fputc/putchar
getchar和putchar對(duì)應(yīng)終端窗口的輸入輸出, 不用指定參數(shù)
getc和fgetc需要指定FILE *fp

void onechar(FILE *fp){
    int ch;
    while((ch=getc(fp)) != EOF){
        if(putchar(ch) == EOF){
            printf("output error");
            exit(1);
        }
    }
    if(ferror(fp)){
        printf("file read error");
        exit(1);
    }
}

每次讀寫一行

fgets/gets
fputs/puts
gets/puts默認(rèn)對(duì)應(yīng)終端窗口的輸入輸出

注意: puts會(huì)在行尾插入添加一個(gè)'\n', 所以當(dāng)我們用puts打印文件時(shí),每行顯示時(shí)都有兩個(gè)'\n'(除最后一行外), 也就是每行內(nèi)容下面都會(huì)有一個(gè)空行

void  oneline(FILE *fp){
    char buf[1024];
    while(fgets(buf,MAXLINE,fp) != NULL){
        if(puts(buf) == EOF){
            printf("output error");
            exit(1);
        }
    }
    if(ferror(fp)){
        printf("read error");
        exit(1);
    }
}

每次讀寫一個(gè)對(duì)象

這種讀寫方式也稱為二進(jìn)制方式, 由我們自己設(shè)定一次讀幾個(gè)<b>字節(jié)</b>

  • size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp)
    參數(shù)含義:從fp讀取, 讀取的內(nèi)容寫到ptr指向的內(nèi)存, 每次讀取size個(gè)字符, 一共讀nobj次, 返回值為實(shí)際讀取的次數(shù)
  • size_t fwrite(const void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp)

struct people{
    char name[10];
    int age;
};
 
void readstruct(){
    struct people man;
    FILE *fp;
    if((fp=fopen("./test.txt","r")) == NULL){
        printf("fopen error");
        exit(1);
    }
    if(fread(&man,sizeof(struct people),1,fp) != 1){
        printf("fread error");
        exit(1);  
    }
    printf("name=%s, age=%d\n",man.name,man.age);
    fclose(fp);
}
 
void writestruct(){
    struct people man;
    int i;
    sprintf(man.name,"charlotte");
    man.age=20;
    FILE *fp;
    if((fp=fopen("./test.txt","w+")) == NULL){
        printf("fopen error");
        exit(1);
    }
    if(fwrite(&man,sizeof(struct people),1,fp) != 1){
        printf("fwrite error");
        exit(1);
    }
    fclose(fp);
}

跳轉(zhuǎn)

創(chuàng)建一個(gè)文件, 然后寫入一些內(nèi)容, 這時(shí)文件指針在文件尾,
如果想用這個(gè)文件指針讀取剛剛寫入的內(nèi)容, 就需要先將文件指針移動(dòng)文件頭部
void rewind(FILE *fp)

將文件指針移動(dòng)文件頭

void fseek(FILE*fp, long offset, int whence)

隨意移動(dòng)到哪里
whence為初步移動(dòng): SEEK_SET 移到文件頭; SEEK_END 移到文件尾; SEEK_CUR 移到當(dāng)前位置(不動(dòng))
offset為精調(diào):確定了whence之后, 再移動(dòng)offset個(gè)位置

臨時(shí)文件

臨時(shí)文件的兩個(gè)特殊需求:1.文件名要唯一 2.不需要時(shí)最好能自己刪除
char *tmpnam(char *ptr):

產(chǎn)生唯一的"路徑/文件名"形式的字符串,傳入的參數(shù)可以為NULL,或者長(zhǎng)度不小于L_tmpnam的字符數(shù)組

FILE *tmpfile()

自動(dòng)生成文件名并創(chuàng)建臨時(shí)文件, 臨時(shí)文件在關(guān)閉或程序退出時(shí)自動(dòng)刪除

如果是一次性讀寫可以直接調(diào)用tmpfile, 如果需要重復(fù)讀寫可以用tmpnam生成文件名然后手動(dòng)創(chuàng)建和刪除文件

int main(){
    printf("just test: %s\n",tmpnam(NULL));
 
    char name[L_tmpnam];
    tmpnam(name);
    printf("name: %s\n",name);
 
    char buf[1024];
    FILE *fp;
    if((fp=tmpfile()) == NULL){
        printf("tmpfile error");
        exit(1);
    }
    fputs("one line\n",fp);
    rewind(fp);
    fgets(buf,1024,fp);
    printf("%s",buf);
    return 0;

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末呀潭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子为障,更是在濱河造成了極大的恐慌齐莲,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件允蜈,死亡現(xiàn)場(chǎng)離奇詭異冤吨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)饶套,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門漩蟆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人妓蛮,你說我怎么就攤上這事怠李。” “怎么了蛤克?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵捺癞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我构挤,道長(zhǎng)髓介,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任筋现,我火速辦了婚禮唐础,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘矾飞。我一直安慰自己一膨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布洒沦。 她就那樣靜靜地躺著豹绪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪微谓。 梳的紋絲不亂的頭發(fā)上森篷,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音豺型,去河邊找鬼仲智。 笑死,一個(gè)胖子當(dāng)著我的面吹牛姻氨,可吹牛的內(nèi)容都是我干的钓辆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼前联!你這毒婦竟也來了功戚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤似嗤,失蹤者是張志新(化名)和其女友劉穎啸臀,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烁落,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乘粒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伤塌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灯萍。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖每聪,靈堂內(nèi)的尸體忽然破棺而出旦棉,到底是詐尸還是另有隱情,我是刑警寧澤药薯,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布绑洛,位于F島的核電站,受9級(jí)特大地震影響果善,放射性物質(zhì)發(fā)生泄漏诊笤。R本人自食惡果不足惜系谐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一巾陕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纪他,春花似錦鄙煤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至薪寓,卻和暖如春亡资,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背向叉。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工锥腻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人母谎。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓瘦黑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子幸斥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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

  • C/C++輸入輸出流總結(jié) 前兩天寫C++實(shí)習(xí)作業(yè)匹摇,突然發(fā)現(xiàn)I/O是那么的陌生,打了好長(zhǎng)時(shí)間的文件都沒有打開甲葬,今天終...
    LuckTime閱讀 1,720評(píng)論 0 6
  • 1廊勃、rewind(FILE *):回到文件開始處2、fprintf(), fscanf(), fgets(), f...
    2016AF閱讀 297評(píng)論 0 0
  • 2016-02-01 標(biāo)準(zhǔn)io 標(biāo)準(zhǔn)io處理了很多細(xì)節(jié)经窖,例如緩存分配供搀,優(yōu)化長(zhǎng)度執(zhí)行io等。 流和file對(duì)象 之前...
    千里山南閱讀 1,172評(píng)論 0 0
  • 積極進(jìn)步钠至,奮力拼搏葛虐,鍛煉意志,強(qiáng)身健體棉钧。風(fēng)里雨里九龍山等你屿脐!九龍山,晚安宪卿!
    a娜寶貝閱讀 128評(píng)論 0 0
  • 作為一個(gè)偽文青的诵,最近開始進(jìn)入瘋狂的裝X模式。 其主要癥狀是佑钾,在亞馬遜上花了五六百塊西疤,去書店看到想看的書也買,買了一...
    K41閱讀 491評(píng)論 0 0