linux高級環(huán)境編程-標準IO

標準IO也是帶緩存的IO钞钙,它們的操作是圍繞流進行退敦,而之前的不帶緩存IO操作是圍繞文件描述符的,標準IO還是基于文件IO或者說系統(tǒng)IO。

image.png

預讀
http://hongyilinux.blog.51cto.com/8030513/1746199
https://segmentfault.com/a/1190000008228426
http://www.yeolar.com/note/2012/05/16/linux-advanced-io/

常用函數(shù)API

FILE *fopen(const char *path, const char *mode)
int fclose(FILE *fp)
int fgetc(FILE *stream)
int fputc(int c, FILE *stream)
char *fgets(char *s, int size, FILE *stream)
int fputs(const char *s, FILE *stream)
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

程序示例:

#include <stdio.h>

int main(int argc, char *argv[])
{
    FILE *fp;

    fp = fopen("stdio.log", "w+");
    if (fp == NULL) {
        printf("File create fail...\n");
        return -1; 
    } else {
        printf("File create success...\n");
    }
    
    /* fwrite() function */ 
    char buffer_1[] = "This is fwrite DEMO..."; 
    size_t wr_size = 0; 
    wr_size = fwrite(buffer_1, 1, sizeof(buffer_1), fp); 
    printf("wr_size = %d\n", wr_size); 

    /* fputs() function */ 
    char buffer_2[] = "\nThis is fputs DEMO...\n"; 
    int fputs_status = 0; 
    fputs_status = fputs(buffer_2, fp); 
    printf("fputs_status = %d\n", wr_size); 
    
    /* puts function */
    char buffer_3[] = "This is puts DEMO..."; 
    puts(buffer_3);

    /* fputc function */
    char buffer_4[] = "This is fputc DEMO...\n";
    int ret;
    for (int i = 0; i < sizeof(buffer_4); i++) {
        ret = fputc(buffer_4[i], fp);
        printf("%c", ret);
    }

    /* putc function */
    char buffer_5[] = "This is putc DEMO...\n";
    for (int i = 0; i < sizeof(buffer_5); i++) {
        ret = fputc(buffer_5[i], fp);
        printf("%c", ret);
    }    
    fclose(fp);   
    return 0; 
}
進一步分析:

IO操作可以分為非格式IO和格式IO道偷,非格式化IO有以下三種缀旁,

image.png
  • 每次讀一行IO
image.png

buf為緩沖區(qū)地址,gets表示從標準輸入讀勺鸦,而fgets從指定的流讀并巍,fgets必須指定緩沖區(qū)長度n,最后一個為null换途,能讀入n-1個字符懊渡,若一行長度大于n,則返回一個不完整的行军拟。gets沒有指定緩沖區(qū)長度會導致可能的溢出剃执,一般棄用。

image.png

fputs將一個以null字節(jié)終止的字符串寫道指定的流懈息,不一定每次一行肾档,要看有沒有換行符,和上面的讀fgets對應辫继。
puts將一個null字節(jié)終止的字符串寫到標準輸出怒见,同時會寫入一個換行符。put盡量不使用姑宽。

  • 二進制IO
    二進制IO操作遣耍,需要一次讀或寫整個結構,如果通過調(diào)用 fputs 和 fgets 實現(xiàn)炮车,由于二進制IO過程中可能會提供 null 字節(jié)而不能正確工作,提供以下函數(shù)舵变。
    image.png

一般有以下兩種常見用法,讀寫一個數(shù)組和讀一個結構瘦穆。

#include <stdio.h>
  
int main ()
{
    FILE *fp = fopen ("output.txt", "w");
    float data[10] = {0, 12, 1.414, 3.562, 43213, 4214};
    if (fwrite (data, sizeof(float), 10, fp) != 10)
    {
        perror ("fwrite error: ");
        return -1;
    }
    return 0;
}
#include <stdio.h>
#include <string.h>
 
#define NAMESIZE 1024
  
struct Str_tmp
{
    short count;
    long total;
    char name[NAMESIZE];
};
  
int main ()
{
    struct Str_tmp item;
    scanf ("%s", item.name);
    item.count = strlen (item.name);
    item.total = 1024;  
      
    FILE *fp = fopen ("output.txt", "w");
  
    if (fwrite (&item, sizeof(item), 1, fp) != 1)
    {
        perror ("fwrite error: ");
        return -1;
    }
    return 0;
}
  • 定位流
  • 格式化IO
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末棋傍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子难审,更是在濱河造成了極大的恐慌瘫拣,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件告喊,死亡現(xiàn)場離奇詭異麸拄,居然都是意外死亡派昧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門拢切,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒂萎,“玉大人,你說我怎么就攤上這事淮椰∥宕龋” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵主穗,是天一觀的道長泻拦。 經(jīng)常有香客問我,道長忽媒,這世上最難降的妖魔是什么争拐? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮晦雨,結果婚禮上架曹,老公的妹妹穿的比我還像新娘。我一直安慰自己闹瞧,他們只是感情好绑雄,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奥邮,像睡著了一般绳慎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上漠烧,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天杏愤,我揣著相機與錄音,去河邊找鬼已脓。 笑死珊楼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的度液。 我是一名探鬼主播厕宗,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼堕担!你這毒婦竟也來了已慢?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤霹购,失蹤者是張志新(化名)和其女友劉穎佑惠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡膜楷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年旭咽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赌厅。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡穷绵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出特愿,到底是詐尸還是另有隱情仲墨,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布揍障,位于F島的核電站目养,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏亚兄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一采驻、第九天 我趴在偏房一處隱蔽的房頂上張望审胚。 院中可真熱鬧,春花似錦礼旅、人聲如沸膳叨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菲嘴。三九已至,卻和暖如春汰翠,著一層夾襖步出監(jiān)牢的瞬間龄坪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工复唤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留健田,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓佛纫,卻偏偏與公主長得像妓局,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子呈宇,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

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

  • C/C++輸入輸出流總結 前兩天寫C++實習作業(yè)好爬,突然發(fā)現(xiàn)I/O是那么的陌生,打了好長時間的文件都沒有打開甥啄,今天終...
    LuckTime閱讀 1,731評論 0 6
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理存炮,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • https://www.wsj.com/articles/how-uber-and-airbnb-won-1485...
    Novazyyy閱讀 552評論 0 0
  • 昨天沖娃發(fā)火了〗┲耄現(xiàn)在有點后悔尚蝌,起因是接回來后一直不好好說話,然后借著他玩水后弄濕褲子還不承認就對他大喊大叫充尉,棒打了...
    紅棗喝閱讀 137評論 0 0
  • 今日大暑飘言,已經(jīng)退出四大火爐的武漢依然熱的讓人想住到冰箱里去。逃到商場的我驼侠,在吃吃喝喝買買買之余姿鸿,還看了兩場電影,分...
    胡十八閱讀 313評論 0 0