一、標(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>