最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中的各種文件讀寫方法小結(jié)

 更新時(shí)間:2015年07月30日 09:41:24   作者:低調(diào)小一  
這篇文章主要介紹了C語言中的各種文件讀寫方法小結(jié),是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下

前言
    找工作的時(shí)候,曾經(jīng)用C語言練習(xí)過一段時(shí)間的算法題目,也在幾個(gè)還算出名的OJ平臺有過還算靠譜的排名。之前以為C語言只限于練習(xí)一下算法,但是工作中的一個(gè)問題解決讓我意識到C語言的用處還是非常廣泛的。下面介紹一下,如果用C語言來操作文件保存一個(gè)字符串,和讀取一個(gè)字符串。算法中往往都是printf來打印出結(jié)果,但是真實(shí)工作中往往通過文件來進(jìn)行一些持久化的存儲工作。

C-File I/O
    文件的I/O操作是每一門語言的重點(diǎn),因此這里我先來介紹一下如何用C語言去進(jìn)行文件的I/O操作。
文件和流
    就C語言程序而言,所有的I/O操作只是簡單地從程序移進(jìn)或移出字節(jié)的事情。因此,這種字節(jié)流便被稱為流(stream)。程序只需要關(guān)心創(chuàng)建正確的輸出字節(jié)數(shù)據(jù),以及正確地解釋從輸入讀取的字節(jié)數(shù)據(jù)。特定I/O設(shè)備的細(xì)節(jié)對程序員是隱藏的。絕大多數(shù)流是完全緩沖的(fully buffered),這意味著“讀取”和“寫入”實(shí)際上是從一塊被稱為緩沖區(qū)(buffer)的內(nèi)存區(qū)域來回復(fù)制數(shù)據(jù)。從內(nèi)存中來回復(fù)制數(shù)據(jù)是非??焖俚摹S糜谳敵隽鞯木彌_區(qū)只有當(dāng)它寫滿時(shí)才會被刷新(flush,物理寫入)到設(shè)備或文件中。一次性把寫滿的緩沖區(qū)寫入和逐片把程序產(chǎn)生的輸出分別寫入相比效率更高。輸入緩沖區(qū)也是類似的原理。
    流分為兩種類型,分別是文本流和二進(jìn)制流。
打開流和關(guān)閉流
    fopen函數(shù)打開一個(gè)特定的文件,并把一個(gè)流和這個(gè)文件相關(guān)聯(lián)。它的原型如下所示:
[cpp] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片

  FILE* open(const char* name, const char* mode); 

    name參數(shù)是你希望打開的文件或設(shè)備的名字。mode參數(shù)標(biāo)識流用于只讀、只寫還是既讀又寫,以及它是文本流還是二進(jìn)制流。下面表格里列出了一些常用的模式:

201573092742054.jpg (544×134)

     如果fopen函數(shù)執(zhí)行成功,它將返回一個(gè)指向FILE結(jié)構(gòu)的指針,該結(jié)構(gòu)代表這個(gè)新創(chuàng)建的流。如果函數(shù)執(zhí)行失敗,它將返回一個(gè)NULL指針,error會提示問題的性質(zhì)。
    流是用函數(shù)fclose關(guān)閉的,它的原型如下:
[cpp] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片

  int fclose(FILE *f); 

    對于輸出流,fclose函數(shù)在文件關(guān)閉之前刷新緩沖區(qū)。如果它執(zhí)行成功,fclose返回零值,否則返回EOF。

    由于fopen和fclose打開和關(guān)閉的都是FILE結(jié)構(gòu)體指針,而在stdio.h頭文件中,包含了對文件結(jié)構(gòu)體FILE的描述。這里介紹一下FILE結(jié)構(gòu)體定義:

  struct _iobuf { 
    char *_ptr; // 下一個(gè)要被讀取的字符的地址 
    int _cnr; // 剩余的字符 
    char *base; // 緩沖區(qū)基地址  
    int _flag; // 讀寫文件標(biāo)志位 
    int _file; // 文件號 
    int _charbuf; // 檢查緩沖區(qū)的狀況  
    int _bufsiz; // 文件的大小 
    char *_tmpfname; // 臨時(shí)文件名 
  }; 
  typedef struct _iobuf FILE; 

字符I/O
    當(dāng)一個(gè)流被打開之后,它可以用于輸入和輸出。它最簡單的形式是字符I/O。字符輸入是由getchar函數(shù)家族執(zhí)行的,它們的原型如下所示:

  int fgetc(FILE *stream); 
  int getc(FILE *stream); 
  int getchar(void); 

    需要操作的流作為參數(shù)傳遞給getc和fgetc,但是getchar始終是從標(biāo)準(zhǔn)輸入讀取。每個(gè)函數(shù)從流中讀取下一個(gè)字符,并把它作為函數(shù)的返回值返回。如果流中不存在更多的字符,函數(shù)就返回常量值EOF(-1)。
    為了把單個(gè)字符寫入到流中,可以使用putchar函數(shù)家族。它的原型如下:
[cpp] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片

  int fputc(int character, FILE* stream); 
  int putc(int character, FILE* stream); 
  int putchar(int character); 

行I/O
    行I/O其實(shí)可以用兩種方式執(zhí)行——未格式化的或者格式化的。這兩種形式都用于操縱字符串。區(qū)別在于未格式化的I/O只是通過fgets和fputs簡單讀取或?qū)懭胱址袷交腎/O則執(zhí)行數(shù)字和其他變量的內(nèi)部或外部表示形式之間的轉(zhuǎn)換。由于日常工作中操作的一般都是格式化I/O,因此這里不講fgets和fputs這種非格式化I/O操作了。(當(dāng)然,還有一個(gè)重要的原因,fgets無法判斷緩沖區(qū)長度,容易導(dǎo)致溢出等情況)
scanf家族
    scanf函數(shù)家族的原型如下所示。每個(gè)原型中的省略號表示一個(gè)可變長度的指針列表。從輸入轉(zhuǎn)換而來的值逐個(gè)存儲到這些指針參數(shù)所指向的內(nèi)存位置。

  int fscanf(FILE* stream, const char* format, ...); 
  int scanf(const char* format, ...); 
  int sscanf(const char* string, const char* format, ...); 

    這些函數(shù)都從輸入源讀取字符并根據(jù)format字符串給出的格式化代碼對它們進(jìn)行轉(zhuǎn)換。當(dāng)格式化字符串到達(dá)末尾或者讀取的輸入不再匹配格式字符串所指定的類型時(shí),輸入就停止。在任何一種情況下,被轉(zhuǎn)換的輸入值的數(shù)目作為函數(shù)的返回值返回。如果在任何輸入值被轉(zhuǎn)換之前文件就已經(jīng)到達(dá)尾部,函數(shù)就返回常量值EOF。
printf家族
    printf函數(shù)家族用于創(chuàng)建格式化的輸出。它們的函數(shù)原型如下:

  int fprintf(FILE *stream, const char* format, ...); 
  int printf(const char* format, ...); 
  int sprintf(char* buffer, const char* format, ...); 

二進(jìn)制I/O
    把數(shù)據(jù)寫到文件里效率最高的方法是用二進(jìn)制形式寫入,而且Android系統(tǒng)里也有很有用二進(jìn)制文件通過位來存儲數(shù)據(jù)的應(yīng)用場景。介紹一下操縱二進(jìn)制I/O的函數(shù)原型。
    fread函數(shù)用于讀取二進(jìn)制數(shù)據(jù),fwrite函數(shù)用于寫入二進(jìn)制數(shù)據(jù)。它們的原型如下所示:
[cpp] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片

  size_t fread(void* buffer, size_t size, size_t count, FILE* stream); 
  size_t fwrite(void* buffer, size_t size, size_t count, FILE* stream); 

    buffer是一個(gè)指向用于保存數(shù)據(jù)的內(nèi)存位置的指針,size是緩沖區(qū)中每個(gè)元素的字節(jié)數(shù),count是讀取或?qū)懭氲脑財(cái)?shù),stream是數(shù)據(jù)讀取或?qū)懭氲牧鳌?br /> 刷新和定位函數(shù)
    在處理流時(shí),另外還有一些函數(shù)也較為有用。首先,是fflush,它迫使一個(gè)輸出流的緩沖區(qū)內(nèi)的數(shù)據(jù)進(jìn)行物理寫入,不管它是不是已經(jīng)寫滿。它的原型如下所示:

  int fflush(FILE* stream); 

    當(dāng)我們需要立即把輸出緩沖區(qū)的數(shù)據(jù)進(jìn)行物理寫入時(shí),應(yīng)該使用這個(gè)函數(shù)。
    在正常的情況下,數(shù)據(jù)以線性的方式寫入,這意味著后面寫入的數(shù)據(jù)在文件中的位置是在以前所有寫入數(shù)據(jù)的后面。C同時(shí)支持隨機(jī)訪問I/O,也就是以任意順序訪問文件的不同位置。隨機(jī)訪問是通過在讀取或?qū)懭肭跋榷ㄎ坏轿募行枰奈恢脕韺?shí)現(xiàn)的。一般使用fseek函數(shù)來實(shí)現(xiàn),函數(shù)原型如下:

  int fseek(FILE* stream, long offset, int from); 

    fseek函數(shù)允許你在一個(gè)流中定位。這個(gè)操作將改變下一個(gè)讀取或?qū)懭氲奈恢?。它的第一個(gè)參數(shù)是需要改變的流,它的第二個(gè)和第三個(gè)參數(shù)標(biāo)識文件中需要定位的位置。下表描述了fseek參數(shù)的使用方法。

201573092824265.jpg (635×255)

相關(guān)文章

  • 利用C++求絕對值的幾種方法例子

    利用C++求絕對值的幾種方法例子

    相信大家在學(xué)習(xí)C++時(shí),應(yīng)該都有做過求絕對值的題目,下面這篇文章主要給大家介紹了關(guān)于利用C++求絕對值的幾種方法例子,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • C語言socket編程開發(fā)應(yīng)用示例

    C語言socket編程開發(fā)應(yīng)用示例

    這篇文章主要介紹了C語言socket編程開發(fā)應(yīng)用,示例簡單,大家參考使用吧
    2013-12-12
  • 從string類的實(shí)現(xiàn)看C++類的四大函數(shù)(面試常見)

    從string類的實(shí)現(xiàn)看C++類的四大函數(shù)(面試常見)

    C++類一般包括構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、析構(gòu)函數(shù)和賦值函數(shù)四大函數(shù),非常常見,本文給大家介紹從string類的實(shí)現(xiàn)看C++類的四大函數(shù),一起看看吧
    2016-06-06
  • C語言動(dòng)態(tài)內(nèi)存規(guī)劃詳解

    C語言動(dòng)態(tài)內(nèi)存規(guī)劃詳解

    這篇文章主要介紹了C語言動(dòng)態(tài)內(nèi)存的規(guī)劃,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-10-10
  • C語言實(shí)現(xiàn)騎士飛行棋

    C語言實(shí)現(xiàn)騎士飛行棋

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)騎士飛行棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • MFC創(chuàng)建模態(tài)對話框和非模態(tài)對話框的方法

    MFC創(chuàng)建模態(tài)對話框和非模態(tài)對話框的方法

    這篇文章主要介紹了MFC創(chuàng)建模態(tài)對話框和非模態(tài)對話框的方法,需要的朋友可以參考下
    2014-07-07
  • C語言實(shí)現(xiàn)簡單三子棋小游戲

    C語言實(shí)現(xiàn)簡單三子棋小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡單三子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++類中的static和const用法實(shí)例教程

    C++類中的static和const用法實(shí)例教程

    這篇文章主要介紹了C++類中的static和const用法,是C++面向?qū)ο蟪绦蛟O(shè)計(jì)中非常重要的概念,需要的朋友可以參考下
    2014-08-08
  • 詳解C++語言中std::array的神奇用法

    詳解C++語言中std::array的神奇用法

    本文的代碼都在C++17環(huán)境下編譯運(yùn)行。當(dāng)前主流的g++版本已經(jīng)能支持C++17標(biāo)準(zhǔn),但是很多版本(如gcc 7.3)的C++17特性不是默認(rèn)打開的,需要手工添加編譯選項(xiàng)-std=c++17,具體內(nèi)容詳情跟隨小編一起學(xué)習(xí)吧
    2021-05-05
  • 一起來學(xué)習(xí)C++的動(dòng)態(tài)內(nèi)存管理

    一起來學(xué)習(xí)C++的動(dòng)態(tài)內(nèi)存管理

    這篇文章主要為大家詳細(xì)介紹了C++的動(dòng)態(tài)內(nèi)存管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03

最新評論

芜湖市| 永城市| 曲水县| 永城市| 江口县| 江西省| 贡嘎县| 怀集县| 铅山县| 永胜县| 沛县| 长阳| 栖霞市| 永修县| 大兴区| 务川| 临沂市| 基隆市| 兰溪市| 田东县| 沁源县| 镇江市| 通辽市| 叙永县| 清涧县| 泸水县| 黄平县| 科技| 遵化市| 南皮县| 大安市| 上杭县| 改则县| 西青区| 和林格尔县| 卓资县| 方城县| 闽侯县| 松滋市| 奉新县| 亳州市|