版權(quán)聲明:本文為小斑馬偉原創(chuàng)文章米间,轉(zhuǎn)載請注明出處筹我!
一腋舌、文件api的分類
01)文件讀寫api
fgetc fputc 按照字符讀寫文件
fputs fgets 按照行讀寫文件 (讀寫配置文件)
fread fwirte 按照塊讀寫文件 (大數(shù)據(jù)塊遷移)
fprintf 按照格式化進行讀寫文件
fprintf(fp, "%s = %s\n", pKey, pValue);
02)文件控制api
文件是否結(jié)束
文件指針的定位、跳轉(zhuǎn)
fseek(fp, 0L, SEEK_END); //把文件指針從0位置開始愉耙,移動到文件末尾
//獲取文件長度;
length = ftell(fp);
fseek(fp, 0L, SEEK_SET);
03)api做項目
二贮尉、標準文件的讀寫
1.文件的打開fopen()
文件的打開操作表示將給用戶指定的文件在內(nèi)存分配一個FILE結(jié)構(gòu)區(qū),并將該結(jié)構(gòu)的指針返回給用戶程序朴沿,以后用戶程序就可用此FILE指針來實現(xiàn)對指定文件的存取操作了猜谚。當使用打開函數(shù)時,必須給出文件名赌渣、文件操作方式(讀魏铅、寫或讀寫),如果該文件名不存在,就意味著建立(只對寫文件而言坚芜,對讀文件則出錯)览芳,并將文件指針指向文件開頭。若已有一個同名文件存在货岭,則刪除該文件路操,若無同名文件,則建立該文件千贯,并將文件指針指向文件開頭屯仗。
fopen(char filename,char type);
其中filename是要打開文件的文件名指針,一般用雙引號括起來的文件名表示搔谴,也可使用雙反斜杠隔開的路徑名魁袜。而type參數(shù)表示了對打開文件的操作方式。其可采用的操作方式如下:
方式 含義
"r" 打開敦第,只讀
"w" 打開峰弹,文件指針指到頭,只寫
"a" 打開芜果,指向文件尾鞠呈,在已存在文件中追加
"rb" 打開一個二進制文件,只讀
"wb" 打開一個二進制文件右钾,只寫
"ab" 打開一個二進制文件蚁吝,進行追加
"r+" 以讀/寫方式打開一個已存在的文件
"w+" 以讀/寫方式建立一個新的文本文件
"a+" 以讀/寫方式打開一個文件文件進行追加
"rb+" 以讀/寫方式打開一個二進制文件
"wb+" 以讀/寫方式建立一個新的二進制文件
"ab+" 以讀/寫方式打開一個二進制文件進行追加
當用fopen(0成功的打開一個文件時,該函數(shù)將返回一個FILE指針舀射,如果文件打開失敗窘茁,將返回一個NULL指針。如想打開test文件脆烟,進行寫:
FILE *fp;
if((fp=fopen("test","w"))==NULL)
{
printf("File cannot be opened\n");
exit();
} else {
printf("File opened for writing\n");
……
fclose(fp);
}
2.關(guān)閉文件函數(shù)fclose()
文件操作完成后山林,必須要用fclose()函數(shù)進行關(guān)閉,這是因為對打開的文件進行寫入時邢羔,若文件緩沖區(qū)的空間未被寫入的內(nèi)容填滿驼抹,這些內(nèi)容不會寫到打開的文件中去而丟失桑孩。只有對打開的文件進行關(guān)閉操作時,停留在文件緩沖區(qū)的內(nèi)容才能寫到該文件中去砂蔽,從而使文件完整洼怔。再者一旦關(guān)閉了文件,該文件對應的FILE結(jié)構(gòu)將被釋放左驾,從而使關(guān)閉的文件得到保護镣隶,因為這時對該文件的存取操作將不會進行。文件的關(guān)閉也意味著釋放了該文件的緩沖區(qū)诡右。
int fclose(FILE *stream);
它表示該函數(shù)將關(guān)閉FILE指針對應的文件安岂,并返回一個整數(shù)值。若成功地關(guān)閉了文件帆吻,則返回一個0值域那,否則返回一個非0值。常用以下方法進行測試:
if(fclose(fp)!=0)
{
printf("File cannot be closed\n");
exit(1);
} else {
printf("File is now closed\n");
}
當打開多個文件進行操作猜煮,而又要同時關(guān)閉時次员,可采用fcloseall()函數(shù),它將關(guān)閉所有在程序中打開的文件王带。
int fcloseall();
該函數(shù)將關(guān)閉所有已打開的文件淑蔚,將各文件緩沖區(qū)未裝滿的內(nèi)容寫到相應的文件中去,接著釋放這些緩沖區(qū)愕撰,并返回關(guān)閉文件的數(shù)目刹衫。如關(guān)閉了4個文件,則當執(zhí)行:n=fcloseall(); 時搞挣,n應為4带迟。
3.按照字符讀文件
include<stdio.h>
int fgetc(FILE* stream);
功能:從stream指定的文件中讀取一個字符
參數(shù):stream:文件指針
返回值:成功:返回讀取到字符 失敗:-1
FILE* fp = fopen("D://a.txt", "r");
if (fp == NULL) {
printf("打開文件失敗\n");
return -1;
}
printf("文件打開成功:%p\n", fp);
char ch;
while ((ch = fgetc(fp)) != EOF) {
printf("%c", ch);
}
fclose(fp);
文件結(jié)尾:在C語言中,EOF表示文件結(jié)束符(end of file)囱桨。在while循環(huán)中以EOF作為文件結(jié)束標志仓犬,這種以EOF作為文件結(jié)束標志的文件,必須是文本文件舍肠。在文本文件中搀继,數(shù)據(jù)都是以字符的ASCII代碼值的行駛存放。
3.按照字符寫文件
int fputc(int ch,FILE* stream);
功能:講ch轉(zhuǎn)換為unsigned char 后寫入stream指定的文件中
參數(shù):ch:需要寫入文件的字符 stream:文件指針
返回值:成功:成功寫入文件的字符 失敗:返回-1
feof函數(shù)貌夕,用來判斷文件是否結(jié)束律歼。feof函數(shù)既可用以判斷二進制文件又可用判斷文本文件民镜。
int feof(FILE *stream)
功能:檢測是否讀取到了文件結(jié)尾啡专。判斷的是最后一次”讀操作的內(nèi)容"不是當前位置內(nèi)容(上一個內(nèi)容)
參數(shù):stream:文件指針
返回值:非0值:已經(jīng)到文件結(jié)尾 0:沒有到文件結(jié)尾
FILE* fp = fopen("D:/a.txt", "w");
if (!fp) {
printf("文件打開失敗\n");
return -1;
}
char ch;
while(1){
scanf("%c", &ch);
if (cj == '@') {
break;
}
fputc(ch, fp);
}
fclose(fp);
4.文件加密和解密
int main(void) {
FILE* fp1 = fopen("D://解密.txt", "r");
FILE* fp2 = fopen("D://加密.txt", "w");
if (!fp1 || !fp2) {
return -1;
}
char ch;
while ((ch = fgetc(ch, fp1)) != EOF) {
ch++;
//加密
fputc(ch, fp2);
}
fclose(fp2);
fclose(fp1);
system("pause");
return 0;
}
int main(void) {
FILE* fp1 = fopen("D://解密.txt", "r");
FILE* fp2 = fopen("D://加密.txt", "w");
if (!fp1 || !fp2) {
return -1;
}
char ch;
while ((ch = fgetc(ch, fp1)) != EOF) {
ch--;
//解密
fputc(ch, fp2);
}
fclose(fp2);
fclose(fp1);
system("pause");
return 0;
}
5.文件行讀操作
功能:從stream指定的文件內(nèi)讀入字符,保存到str所指定的內(nèi)存空間改橘,直到出換行字符韧拒、讀到文件結(jié)尾或是已讀了size-1個字符為止,最后會自動加上'\0'作為字符串結(jié)束澄干。
參數(shù):str:字符串 size:指定最大讀取字符串的長度(size-1) stream:文件指針
返回值:成功:成功讀取的字符串 讀到文件尾或出錯:NULL
fgets()在讀取一個用戶通過鍵盤輸入的字符串的時候慧库,同時把用戶輸入的回車也作為字符串的一部分跷跪。通過scanf和gets輸入一個字符串的時候,不包含結(jié)尾的"\n"齐板,但通過fgets結(jié)尾多了"\n"吵瞻。fgets()函數(shù)是安全的,不存在緩沖區(qū)溢出的問題甘磨。
FILE* fp = fopen("D://a.txt", "r");
if (!fp)
return -1;
char* p = (char*)malloc(sizeof(char)* 100);
//feof(文件指針) 判斷文件是否到結(jié)尾 可以判斷文本文件也可以判斷二進制文件
//如果到文件結(jié)尾返回值為 非0的值
//如果沒有到文件結(jié)尾返回值為 0
while (!feof(fp)) {
memset(p, 0, 100);
fgets(p, 100, fp);
printf("%s\n", p);
}
free(p);
fclose(fp);
5.文件行寫操作
功能:將str所指定的字符串寫入到stream指定的文件中橡羞,字符結(jié)束符'\0'不寫入文件。
參數(shù):str 字符串 stream 文件指針,如果把字符串輸出到屏幕济舆,固定寫為stdout
返回值:成功 0 失敗 -1
fputs()是puts()的文件操作版本卿泽,但fputs()不會自動輸出一個'\n'
FILE* fp = fopen("D:/d.txt", "w");
if (!fp)
return -1;
char ch[] = "你哈哈哈";
fputs(ch, fp);
fclose(fp);
system("pause");
鍵盤輸入 寫入文件中
FILE* fp = fopen("D://B.txt", "w");
if (!fp)
return -1;
char* p = (char*)malloc(sizeof(char)* 1024);
while (1) {
memset(p, 0, 1024);
//fgets()
scanf("%[^\n]", p);
//吞噬回車\n
getchar();
//停止輸入命令 comm = exit
if (!strcmp(p, "comm=exit"))
break;
//追加\n
strcat(p, "\n");
fputs(p, fp);
}
free(p);
fclose(fp);
6.四則運算文件行寫操作
enum opt {
add,sub,mlt,dive
}op;
int main() {
srand((size_t)time(NULL));
FILE* fp = fopen("D://四則運算.txt", "w");
if (!fp) {
return -1;
}
int a, b;
char c;//+ - * /
char* p = (char*)malloc(sizeof(char)* 20);
for (int i = 0; i < 100; i++) {
a = rand() % 10 + 1;
b = rand() % 10 + 1;
switch (rand()%4)
{
case add: c = '+';
break;
case sub: c = '-';
break;
case mlt: c = '*';
break;
case dive: c = '/';
break;
default:
break;
}
memset(p, 0, 20);
printf(p, "%d%c%d=\n", a, c, b);
fputs(p, fp);
}
free(p);
fclose(fp);
system("pause");
return 1;
}
6.四則運算文件行讀操作
FILE* fp1 = fopen("D:/四則運算.txt", "r");
FILE* fp2 = fopen("D:/四則運算結(jié)果.txt", "w");
if (!fp1 || !fp2) {
printf("打開文件失敗\n");
return -1;
}
int a,b,sum;
char c;
char* p = (char*)malloc(sizeof(char)*20);
for (int i = 0; i < 100; i++) {
memset(p, 0, 20);
fgets(p,20,fp1);
sscanf(p, "%d%c%d=\n", &a, &c, &b);
switch (c) {
case '+':sum = a + b; break;
case '-':sum = a - b; break;
case '*':sum = a * b; break;
case '/':sum = a / b; break;
}
memset(p, 0, 20);
sprintf(p, "%d%c%d = %d\n", a, c, b, sum);
fputs(p, fp2);
}
free(p);
fclose(fp1);
fclose(fp2);
return 0;