文件IO的相關(guān)函數(shù)

一、標(biāo)準(zhǔn)IO

概念:標(biāo)準(zhǔn)是指遵循AVSI C標(biāo)準(zhǔn),標(biāo)準(zhǔn)IO實(shí)際上是通過(guò)標(biāo)準(zhǔn)C庫(kù)里面的函數(shù)來(lái)完成的。

特點(diǎn):標(biāo)準(zhǔn)IO內(nèi)部實(shí)現(xiàn)了一種緩沖機(jī)制 標(biāo)準(zhǔn)IO通過(guò)利用緩沖機(jī)制,減少系統(tǒng)調(diào)用的次數(shù)來(lái)提高程序執(zhí)行效率;

標(biāo)準(zhǔn)IO一般用于訪問(wèn)普通文件,它是在文件IO的基礎(chǔ)上添加了緩沖機(jī)制。

二、流

概念:文件IO操作簡(jiǎn)單從文件輸入和輸出數(shù)據(jù),稱為字節(jié)流,也叫作流。

流的類型:

1、文本流

文本流處理數(shù)據(jù)都是以字符的方式處理

最終所有數(shù)據(jù)都會(huì)轉(zhuǎn)換為對(duì)應(yīng)的ASCII碼值處理

"hello" == 'h' 'e' 'l' 'l' 'o'

"1234"? == '1' '2' '3' '4'? ?對(duì)應(yīng)的ASCII碼值:49? 50? 51? 51

文本流和二進(jìn)制流處理?yè)Q行符方式不一樣(Windows下面,linux下面沒(méi)有區(qū)別)

文 本 流:'\n' == '\r' '\n' 13 10

二進(jìn)制流:'\n' == '\n'

2、二進(jìn)制流

二進(jìn)制流處理數(shù)據(jù)都是以轉(zhuǎn)換成二進(jìn)制處理

"1234" == 100 1101 0010 //直接轉(zhuǎn)成二進(jìn)制流

三種特殊流:

stdin? -- 標(biāo)準(zhǔn)輸入流 -- 0 (鍵盤)

stdout -- 標(biāo)準(zhǔn)輸出流 -- 1 (終端)

stderr -- 標(biāo)準(zhǔn)錯(cuò)誤流 -- 2

三、緩沖區(qū)

1、全緩存:當(dāng)打開(kāi)一個(gè)普通文件時(shí),默認(rèn)使用全緩存

特點(diǎn):只有當(dāng)緩沖區(qū)滿或者空時(shí)才能進(jìn)行實(shí)際的讀寫操作

2、行緩存:當(dāng)打開(kāi)操作的文件跟終端相關(guān)時(shí),使用行緩存

特點(diǎn):當(dāng)行緩存遇到'\n'或者緩沖區(qū)滿的情況下才做讀寫操作

3、無(wú)緩存:當(dāng)需要輸出打印錯(cuò)誤結(jié)果時(shí)用無(wú)緩存

特點(diǎn):

四、標(biāo)準(zhǔn)IO相關(guān)函數(shù)

{

fopen()/fclose()

fgetc()/fputc()

fgets()/fputs()

fread()/fwrite()

feof()/ferror()

ftell()/fseek()/rewind()

}

首先先提一下利用man查看函數(shù)的使用方法:

{

man 1:可執(zhí)行程序和shell命令

man 2:系統(tǒng)調(diào)用函數(shù)

man 3:標(biāo)準(zhǔn)庫(kù)函數(shù)

}

1、打開(kāi)文件?

?fopen()

#include <stdio.h>//頭文件

FILE *fopen(const char *path, const char *mode)//函數(shù)原型

參數(shù):

path:打開(kāi)的文件名(可包含文件路徑)

mode:打開(kāi)文件方式

r :以只讀方式打開(kāi)文件 -- 文件不存在,則無(wú)法打開(kāi)文件,打開(kāi)文件會(huì)清空文件內(nèi)容

r+:以讀寫方式打開(kāi)文件 -- 文件不存在,則無(wú)法打開(kāi)文件,打開(kāi)文件會(huì)清空文件內(nèi)容

w :以只寫方式打開(kāi)文件 -- 文件不存在,則創(chuàng)建文件在打開(kāi),打開(kāi)文件會(huì)清空文件內(nèi)容

w+:以讀寫方式打開(kāi)文件 -- 文件不存在,則創(chuàng)建文件在打開(kāi),打開(kāi)文件會(huì)清空文件內(nèi)容

a :以只寫方式打開(kāi)文件 -- 如果文件不能存在則會(huì)先創(chuàng)建,并在文件末尾追加輸入內(nèi)容

a+:以只寫方式打開(kāi)文件 -- 如果文件不能存在則會(huì)先創(chuàng)建,并在文件末尾追加輸入內(nèi)容//換行追加

返回值:成功返回流指針,失敗返回-1;

舉例:FILE *fp = fopen("1.txt", "r+");

2、關(guān)閉流

?fclose()

#include <stdio.h>//頭文件

int fclose(FILE *fp)//函數(shù)原型

參數(shù):關(guān)閉文件對(duì)應(yīng)的流指針

返回值:成功返回0,失敗返回-1.

舉例:fclose(fp);

3、錯(cuò)誤處理

errno:錯(cuò)誤號(hào)

strerror()

(1) #include <string.h>

#include <errno.h>//需要添加頭文件

char *strerror(int errnum)//函數(shù)原型

參數(shù):

errno:錯(cuò)誤號(hào)

返回值:

成功返回錯(cuò)誤的字符串,失敗返回"Ukown error!"

perror()

(2) #include <stdio.h>

void perror(const char *s);//比較常用

參數(shù):

s:錯(cuò)誤信息,隨意填一個(gè)字符串

perror()//可以直接打印錯(cuò)誤,不用添加頭文件

舉例:

if(NULL == fp)

{

// perror("open 1.txt.");

printf("%s\n",strerror(errno));

return -1;

}

4、按字節(jié)輸入輸出

fgetc()

#include <stdio.h>

int fgetc(FILE *stream)

功能:向指定流中輸入單個(gè)字節(jié)

參數(shù):

stream:對(duì)應(yīng)的流指針

返回值:

成功:返回得到的字符

失敗或者讀到文件末尾:返回-1

fputc()

#include <stdio.h>

int fputc(int c, FILE *stream);

功能:向指定流中輸出指定字符

參數(shù):

c:要輸出的字符

stream:指定的流指針

返回值:成功返回輸出字符,失敗或者讀到文件末尾返回-1;

練習(xí):

1、計(jì)算一個(gè)文件的大小

2、實(shí)現(xiàn)文件的復(fù)制

5、按行進(jìn)行輸入和輸出

fgets()

#include <stdio.h>

char *fgets(char *s, int size, FILE *stream);

返回值:

成功返回得到輸入字符串的首地址,失敗返回NULL;

參數(shù):

s:輸入數(shù)據(jù)的首地址

size:輸入一行數(shù)據(jù)的大小

stream:對(duì)應(yīng)文件的流指針

注意:

fgets()輸入時(shí)遇到'\n'結(jié)束

最大輸入的字節(jié)數(shù)為(size-1)個(gè)

fputs()

#include <stdio.h>

int fputs(const char *s, FILE *stream);

參數(shù):

s:輸入數(shù)據(jù)的首地址

stream:對(duì)應(yīng)文件的流指針

返回值:失敗返回-1

練習(xí):

1、計(jì)算文件的行數(shù)

2、實(shí)現(xiàn)文件的復(fù)制

6、按對(duì)象輸入輸出數(shù)據(jù)

fread()

void *表示可以傳入任意類型的指針

#include <stdio.h>

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

參數(shù):

ptr:存放讀取內(nèi)容的首地址

size:一個(gè)對(duì)象的字節(jié)數(shù)大小(一次讀多大字節(jié)的對(duì)象)

nemmb:讀取對(duì)象的個(gè)數(shù)

stream:對(duì)應(yīng)文件的流指針

返回值:

成功返回讀寫的對(duì)象個(gè)數(shù)

fwrite()

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

參數(shù):

ptr:存放寫入內(nèi)容的首地址

size:一個(gè)對(duì)象的字節(jié)數(shù)大小(一次寫多大字節(jié)的對(duì)象)

nemmb:寫入對(duì)象的個(gè)數(shù)

stream:對(duì)應(yīng)文件的流指針

返回值:

成功返回讀寫的對(duì)象個(gè)數(shù)

7、判斷錯(cuò)誤流 -- feof、ferror

feof()

#include <stdio.h>

int feof(FILE *stream);

返回值:

返回1表示只讀到文件末尾,0表示失敗

ferror()

int ferror(FILE *stream);

返回值:

返回1表示錯(cuò)誤退出,0表示失敗

8、刷新流fflush()

#include <stdio.h>

int fflush(FILE *stream);

參數(shù):

stream:流指針

返回值:

成功返回0,失敗返回-1;

9、定位流(文件指針)

-- ftell / fseek / rewind

#include <stdio.h>

ftell()

long ftell(FILE *stream);

參數(shù):

stream:流指針

返回值:

成功返回文件指針相對(duì)于文件開(kāi)頭的偏移量,失敗返回-1

fseek()

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

參數(shù):

stream:流指針

offset:偏移量

whence:定位基準(zhǔn)點(diǎn)

{

SEEK_SET:定位在文件開(kāi)頭

SEEK_CUR:定位在文件指針當(dāng)前位置

SEEK_END:定位在文件末尾

}

流的定位等于:偏移量+基準(zhǔn)點(diǎn)

rewind()

功能:

void rewind(FILE *stream);

將文件指針定位在文件開(kāi)頭

sprintf

10、獲取時(shí)間

ctime

#include <time.h>

time(&t);

char *ctime(const time_t *timep);

time

time_t time(time_t *tloc);

返回值:

成功返回字符串

localtime

struct tm *localtime(const time_t *timep);

truct tm {

? ? ? ? ? ? ? int tm_sec;? ? /* Seconds (0-60) */

? ? ? ? ? ? ? int tm_min;? ? /* Minutes (0-59) */

? ? ? ? ? ? ? int tm_hour;? /* Hours (0-23) */

? ? ? ? ? ? ? int tm_mday;? /* Day of the month (1-31) */

? ? ? ? ? ? ? int tm_mon;? ? /* Month (0-11) */

? ? ? ? ? ? ? int tm_year;? /* Year - 1900 */

? ? ? ? ? ? ? int tm_wday;? /* Day of the week (0-6, Sunday = 0) */

? ? ? ? ? ? ? int tm_yday;? /* Day in the year (0-365, 1 Jan = 0) */

? ? ? ? ? ? ? int tm_isdst;? /* Daylight saving time */

? ? ? ? ? };

12、sprintf--補(bǔ)充

int sprintf(char *str, const char *format, ...);

參數(shù):

str:輸入數(shù)據(jù)的首地址

format:要寫入str中的文本

練習(xí):向文件中每隔一秒寫入當(dāng)前行數(shù)和時(shí)間

主要在于sprintf()的使用方法

第一天學(xué)習(xí)文件IO的筆記?。。。。?/p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容