C語言基礎(chǔ)---文件操作

版權(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;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市滋觉,隨后出現(xiàn)的幾起案子签夭,更是在濱河造成了極大的恐慌,老刑警劉巖椎侠,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件第租,死亡現(xiàn)場離奇詭異,居然都是意外死亡肺蔚,警方通過查閱死者的電腦和手機煌妈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宣羊,“玉大人璧诵,你說我怎么就攤上這事〕鸱耄” “怎么了之宿?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長苛坚。 經(jīng)常有香客問我比被,道長,這世上最難降的妖魔是什么泼舱? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任等缀,我火速辦了婚禮,結(jié)果婚禮上娇昙,老公的妹妹穿的比我還像新娘尺迂。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布噪裕。 她就那樣靜靜地躺著蹲盘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膳音。 梳的紋絲不亂的頭發(fā)上召衔,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音祭陷,去河邊找鬼苍凛。 笑死,一個胖子當著我的面吹牛兵志,可吹牛的內(nèi)容都是我干的毫深。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼毒姨,長吁一口氣:“原來是場噩夢啊……” “哼哑蔫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起弧呐,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤闸迷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后俘枫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腥沽,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年鸠蚪,在試婚紗的時候發(fā)現(xiàn)自己被綠了今阳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡茅信,死狀恐怖盾舌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蘸鲸,我是刑警寧澤妖谴,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站酌摇,受9級特大地震影響膝舅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窑多,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一仍稀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧埂息,春花似錦技潘、人聲如沸判沟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吧秕,卻和暖如春琉闪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背砸彬。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工颠毙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人砂碉。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓蛀蜜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親增蹭。 傳聞我的和親對象是個殘疾皇子滴某,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

  • [轉(zhuǎn)]C/C++ 文件讀寫操作總結(jié) 在編程的過程中,文件的操作是一個經(jīng)常用到的問題滋迈,在C++Builder中霎奢,可以...
    天之道天知道閱讀 5,195評論 0 7
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)饼灿,斷路器幕侠,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • C/C++輸入輸出流總結(jié) 前兩天寫C++實習作業(yè),突然發(fā)現(xiàn)I/O是那么的陌生碍彭,打了好長時間的文件都沒有打開晤硕,今天終...
    LuckTime閱讀 1,721評論 0 6
  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,734評論 0 10
  • 當你老了庇忌,白發(fā)蒼蒼舞箍,睡意蒙眬, 在爐前打盹皆疹,請取下這本詩篇创译, 慢慢吟誦,夢見你當年的雙眼墙基, 那柔美的光芒與青幽的暈...
    本藩閱讀 466評論 0 0