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

首頁 > 編程 > C > 正文

C語言中的各種文件讀寫方法小結

2020-01-26 15:01:04
字體:
來源:轉載
供稿:網友

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

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

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

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

201573092742054.jpg (544×134)

     如果fopen函數執行成功,它將返回一個指向FILE結構的指針,該結構代表這個新創建的流。如果函數執行失敗,它將返回一個NULL指針,error會提示問題的性質。
    流是用函數fclose關閉的,它的原型如下:
[cpp] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片

  int fclose(FILE *f); 

    對于輸出流,fclose函數在文件關閉之前刷新緩沖區。如果它執行成功,fclose返回零值,否則返回EOF。

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

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

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

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

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

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

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

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

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

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

二進制I/O
    把數據寫到文件里效率最高的方法是用二進制形式寫入,而且Android系統里也有很有用二進制文件通過位來存儲數據的應用場景。介紹一下操縱二進制I/O的函數原型。
    fread函數用于讀取二進制數據,fwrite函數用于寫入二進制數據。它們的原型如下所示:
[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是一個指向用于保存數據的內存位置的指針,size是緩沖區中每個元素的字節數,count是讀取或寫入的元素數,stream是數據讀取或寫入的流。
刷新和定位函數
    在處理流時,另外還有一些函數也較為有用。首先,是fflush,它迫使一個輸出流的緩沖區內的數據進行物理寫入,不管它是不是已經寫滿。它的原型如下所示:

  int fflush(FILE* stream); 

    當我們需要立即把輸出緩沖區的數據進行物理寫入時,應該使用這個函數。
    在正常的情況下,數據以線性的方式寫入,這意味著后面寫入的數據在文件中的位置是在以前所有寫入數據的后面。C同時支持隨機訪問I/O,也就是以任意順序訪問文件的不同位置。隨機訪問是通過在讀取或寫入前先定位到文件中需要的位置來實現的。一般使用fseek函數來實現,函數原型如下:

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

    fseek函數允許你在一個流中定位。這個操作將改變下一個讀取或寫入的位置。它的第一個參數是需要改變的流,它的第二個和第三個參數標識文件中需要定位的位置。下表描述了fseek參數的使用方法。

201573092824265.jpg (635×255)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久视频免费观看| 日韩精品免费综合视频在线播放| 一区二区三区亚洲| 欧美午夜精品久久久久久人妖| 97在线免费视频| 日韩大片在线观看视频| 欧美激情亚洲综合一区| 色哟哟入口国产精品| 日本成人在线视频网址| 黑人精品xxx一区| 一区二区三区视频免费在线观看| 欧美高清第一页| 日韩精品免费电影| 日本欧美黄网站| 精品国产精品自拍| 欧美怡春院一区二区三区| 国产成人精品av在线| 日韩有码在线观看| 欧美整片在线观看| 久久久精品视频在线观看| 色青青草原桃花久久综合| 国产精品中文在线| 久久久亚洲欧洲日产国码aⅴ| 国产日韩在线看片| 国产一区二区三区免费视频| 久久精品视频99| 91夜夜揉人人捏人人添红杏| 日韩美女免费观看| 精品一区二区电影| 欧美激情综合亚洲一二区| 在线亚洲午夜片av大片| 欧美日韩成人在线播放| 日韩的一区二区| 色综合天天综合网国产成人网| 欧美日韩国产中文字幕| 91最新在线免费观看| 日韩在线观看网站| 亚洲午夜女主播在线直播| 91网站免费观看| 97色伦亚洲国产| 久久夜色精品国产欧美乱| 91夜夜揉人人捏人人添红杏| 国产久一一精品| 国产精品a久久久久久| 国内精品视频一区| 欧美性xxxxx极品娇小| 亚洲日本中文字幕免费在线不卡| 国产网站欧美日韩免费精品在线观看| 精品久久久一区| 欧美日韩国产成人高清视频| 国产精品伦子伦免费视频| 亚洲欧美精品中文字幕在线| 6080yy精品一区二区三区| 综合网中文字幕| 成人网页在线免费观看| 欧美性高潮在线| 欧美性猛交xxxx黑人猛交| 在线观看中文字幕亚洲| 97在线精品国自产拍中文| 成人免费福利视频| 欧美精品生活片| 亚洲精品美女在线| 亚洲欧美日韩一区在线| 亚洲男人天天操| 久久男人资源视频| 亚洲第一页自拍| 亚洲图片欧美午夜| 69**夜色精品国产69乱| 亚洲欧美中文在线视频| 2020国产精品视频| 国产在线精品一区免费香蕉| 欧美性生活大片免费观看网址| 国产综合在线视频| 中文字幕欧美精品在线| 国产精品91久久久| 欧美精品国产精品日韩精品| 欧美日韩视频免费播放| 日韩在线资源网| 成人a免费视频| 久久久久久久久久久91| 91在线观看免费观看| 性欧美长视频免费观看不卡| 亚洲精品久久视频| 国产69精品久久久久9| 日韩精品在线免费播放| 欧美日韩在线视频一区二区| 欧美亚洲国产精品| 色播久久人人爽人人爽人人片视av| 欧美大肥婆大肥bbbbb| 国产精品爽爽ⅴa在线观看| 亚洲伊人久久综合| 成人欧美在线观看| 国产亚洲欧洲高清一区| 国产丝袜一区二区三区免费视频| 欧美激情一区二区三级高清视频| 欧美性精品220| 国产一区二区丝袜高跟鞋图片| 日韩美女免费线视频| 精品久久久国产| 在线观看欧美日韩国产| 久久中文字幕视频| 亚洲天堂精品在线| 欧美超级乱淫片喷水| 亚洲少妇激情视频| 日韩电影在线观看永久视频免费网站| 亚洲直播在线一区| 91亚洲精品视频| 国精产品一区一区三区有限在线| 国产精品欧美一区二区三区奶水| 一区二区三区回区在观看免费视频| 欧美韩日一区二区| 日韩精品在线视频观看| 精品露脸国产偷人在视频| 久久精品小视频| 亚洲性生活视频在线观看| 91夜夜揉人人捏人人添红杏| 欧美日韩精品国产| 欧美成人免费网| 亚洲自拍小视频| 精品人伦一区二区三区蜜桃免费| 亚洲护士老师的毛茸茸最新章节| 91免费看片网站| 九九热这里只有精品免费看| 国产精品丝袜久久久久久不卡| 欧美亚洲一区在线| 精品久久中文字幕久久av| 久久久久久久91| 亚洲色图av在线| 永久免费毛片在线播放不卡| 久久九九免费视频| 欧美黑人巨大精品一区二区| 91久久国产综合久久91精品网站| 欧美一级免费视频| 欧美一级电影免费在线观看| 日本欧美中文字幕| 日韩成人av在线播放| 成人中心免费视频| 国产在线a不卡| 91香蕉电影院| 欧美成人精品在线播放| 一区二区三区高清国产| 欧美猛交免费看| 国产ts一区二区| 午夜精品久久久久久久久久久久久| 92福利视频午夜1000合集在线观看| 97在线视频免费| 久久久免费精品| 欧美激情在线狂野欧美精品| 亚洲r级在线观看| 不卡av在线播放| 欧美高清视频在线观看| 黄色一区二区三区| 亚洲成人动漫在线播放| 亚洲变态欧美另类捆绑| 激情久久av一区av二区av三区| 久久久久九九九九| 欧美一级片在线播放| 日韩一区在线视频| 久久激情五月丁香伊人| 欧美激情高清视频| 国产精品久久久久久av福利软件| 日韩欧美中文在线| 热久久这里只有| 日本高清+成人网在线观看|