柚子快報(bào)邀請(qǐng)碼778899分享:【C語言】文件操作
柚子快報(bào)邀請(qǐng)碼778899分享:【C語言】文件操作
目錄
一、什么是文件:
二、文件名:
三、文件指針:
四、文件的打開與關(guān)閉:
五、文件的順序讀寫:
1、fgetc與fputc:
2、fgets與fputs:
3、fscanf與fprintf:
4、fread和fwrite:
六、文件的隨機(jī)讀寫:
1、fseek:
2、ftell:
七、文件緩沖區(qū):
一、什么是文件:
磁盤上的那些文件就是文件。文件能夠做到實(shí)例化,比如在學(xué)生信息系統(tǒng)中,將學(xué)生的信息存儲(chǔ)到文件中就不會(huì)每次重啟程序的時(shí)候消失了。
文件分為程序文件和數(shù)據(jù)文件,
程序文件:源程序文件(后綴為.c),目標(biāo)文件(Windows環(huán)境中后綴為.obj),可執(zhí)行程序(Windows環(huán)境后綴為.exe);
數(shù)據(jù)文件:文件可以是程序運(yùn)行時(shí)讀寫的數(shù)據(jù),比如在程序運(yùn)行中,從中讀取數(shù)據(jù)或者寫入其中或者追加其中的文件。
這里討論的是數(shù)據(jù)文件,在磁盤上進(jìn)行處理的文件。
二、文件名:
文件名包含三部分:文件路徑+文件主體+文件后綴。
? ? ? ? ? ? ? ? ? ? ?例如:E:\work\test.txt
三、文件指針:
每個(gè)被使用的文件都在內(nèi)存中開辟了一個(gè)相應(yīng)的文件信息區(qū),用來存放文件的相關(guān)信息(如文件的名字,文件狀態(tài)及文件當(dāng)前的位置等)。這些信息是保存在一個(gè)結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類型是有系統(tǒng)聲明的,取名為FILE。
四、文件的打開與關(guān)閉:
1、打開:(fopen)
返回一個(gè)文件指針類型,前一個(gè)參數(shù)為文件名,后一個(gè)參數(shù)如下:
其中mode可以是:
2、關(guān)閉:(fclose)
需要傳文件指針,如果關(guān)閉成功就返回0,關(guān)閉失敗就返回EOF。
int main()
{
FILE* pf = fopen("E:\\test\\test1.txt", "r");
if (pf == NULL)
{
perror("fopen fail");
return 1;
}
else {
printf("打開文件成功");
}
fclose(pf);
pf = NULL;
return 0;
}
以上就是一個(gè)打開文件的標(biāo)準(zhǔn)形式。
五、文件的順序讀寫:
接下來依次介紹上述函數(shù):
1、fgetc與fputc:
這組是從文件中讀取一個(gè)字符或?qū)懭胍粋€(gè)字符的:
往文件中寫入字符:
fputc:
int main()
{
FILE* pf = fopen("E:\\test\\test1.txt", "w");
if (pf == NULL)
{
perror("fopen fail");
return 1;
}
//寫文件:
fputc('a', pf);
fputc('b', pf);
fputc('c', pf);
fputc('d', pf);
fputc('e', pf);
fclose(pf);
pf = NULL;
return 0;
}
從文件中讀取字符:
fgetc:
int main()
{
FILE* pf = fopen("E:\\test\\test1.txt", "r");
if (pf == NULL)
{
perror("fopen fail");
return 1;
}
//讀取文件:
char ch1 = fgetc(pf);
printf("%c\n", ch1);
char ch2 = fgetc(pf);
printf("%c\n", ch2);
char ch3 = fgetc(pf);
printf("%c\n", ch3);
char ch4 = fgetc(pf);
printf("%c\n", ch4);
fclose(pf);
pf = NULL;
return 0;
}
2、fgets與fputs:
這是將數(shù)據(jù)一行一行地進(jìn)行處理的。
往文件中寫入數(shù)據(jù):
fputs:
int main()
{
FILE* pf = fopen("E:\\test\\test1.txt", "w");
if (pf == NULL)
{
perror("fopen fail");
return 1;
}
//寫文件:
fputs("hello ppr\n", pf);
fputs("hello world\n", pf);
//關(guān)閉文件
fclose(pf);
pf = NULL;
return 0;
}
從文件中讀數(shù)據(jù)。
fgets:
int main()
{
FILE* pf = fopen("E:\\test\\test1.txt", "r");
if (pf == NULL)
{
perror("fopen fail");
return 1;
}
//讀取文件:
char arr[20] = { 0 };
fgets(arr, 20, pf);
printf("%s", arr);
fgets(arr, 20, pf);
printf("%s", arr);
//關(guān)閉文件
fclose(pf);
pf = NULL;
return 0;
}
如上所示,就是剛剛寫好的文件中讀取字符串放在arr數(shù)組中,然后在打印在屏幕上,
注意:在這里的20是指讀取一整行的20個(gè)字符,如果這行不夠20個(gè)字符并不會(huì)去下一行讀。
? ? ? ? ? ?還有,這里在最后會(huì)加上一個(gè)\0所以實(shí)際讀取的字符是19,比我需要讀取的字符小1。
3、fscanf與fprintf:
這組是格式化的寫入和讀取文件:
格式化寫入文件:
第一個(gè)參數(shù)是一個(gè)文件指針類型,需要我的文件寫入到哪兒。
后面的參數(shù)就是和printf一樣了
struct S
{
char name[20];
int age;
float score;
};
int main()
{
FILE* pf = fopen("E:\\test\\test1.txt", "w");
if (pf == NULL)
{
perror("fopen fail");
return 1;
}
struct S s = { "張三",18,91.7 };
//寫文件:
fprintf(pf, "%s %d %f", s.name, s.age, s.score);
//關(guān)閉文件
fclose(pf);
pf = NULL;
return 0;
}
格式化讀文件:
第一個(gè)參數(shù)是一個(gè)文件指針類型,需要我的數(shù)據(jù)從哪里讀
后面就是和scanf一樣了(記得取地址哦)
struct S
{
char name[20];
int age;
float score;
};
int main()
{
struct S s;
FILE* pf = fopen("E:\\test\\test1.txt", "r");
if (pf == NULL)
{
perror("fopen fail");
return 1;
}
//讀取文件:
fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));
printf("%s %d %f", s.name, s.age, s.score);
//關(guān)閉文件
fclose(pf);
pf = NULL;
return 0;
}
4、fread和fwrite:
這是以二進(jìn)制形式輸入和輸出的,這個(gè)只適用于文件流,上述其他的適用于所有流
第一個(gè)參數(shù)是取要存儲(chǔ)變量的地址,第二個(gè)是這個(gè)變量的大小,第三個(gè)是我要存儲(chǔ)幾個(gè)變量
第四個(gè)是文件所在的位置。
struct S
{
char name[20];
int age;
float score;
};
int main()
{
FILE* pf = fopen("E:\\test\\test1.txt", "wb");
if (pf == NULL)
{
perror("fopen fail");
return 1;
}
struct S s = { "張三",18,91.7 };
//寫文件:
fwrite(&s, sizeof(struct S), 1, pf);
//關(guān)閉文件
fclose(pf);
pf = NULL;
return 0;
}
以上就是以二進(jìn)制的形式存儲(chǔ)的,看是看不懂,但是可以讓計(jì)算機(jī)以二進(jìn)制形式讀它:
這個(gè)形式參數(shù)的意義基本fwrite是一樣的,不一樣的是&s是將讀出來的數(shù)據(jù)放到變量s中
struct S
{
char name[20];
int age;
float score;
};
int main()
{
struct S s;
FILE* pf = fopen("E:\\test\\test1.txt", "wr");
if (pf == NULL)
{
perror("fopen fail");
return 1;
}
//讀取文件:
fread(&s, sizeof(struct S), 1, pf);
printf("%s %d %f", s.name, s.age, s.score);
//關(guān)閉文件
fclose(pf);
pf = NULL;
return 0;
}
六、文件的隨機(jī)讀寫:
1、fseek:
第一個(gè)參數(shù)是我要操作文件的地址,第三個(gè)參數(shù)是將文件的光標(biāo)從哪兒開始偏移的,第二個(gè)參數(shù)是光標(biāo)進(jìn)行偏移的個(gè)數(shù)。
第一個(gè)從文件開頭開始偏移,
第二個(gè)從文件當(dāng)前位置開始偏移,
第三個(gè)從文件末尾開始偏移。
int main()
{
FILE* pf = fopen("E:\\test\\test2.txt", "r");
if (pf == NULL)
{
perror("fopen fail");
return 1;
}
//讀取文件:
int ch = fgetc(pf);
printf("%c\n", ch);
ch = fgetc(pf);
printf("%c\n", ch);
ch = fgetc(pf);
printf("%c\n", ch);
ch = fgetc(pf);
printf("%c\n", ch);
fseek(pf, -2, SEEK_CUR);
ch = fgetc(pf);
printf("%c\n", ch);
fseek(pf, 1, SEEK_SET);
ch = fgetc(pf);
printf("%c\n", ch);
//關(guān)閉文件
fclose(pf);
pf = NULL;
return 0;
}
2、ftell:
返回文件指針相對(duì)于起始位置的偏移量:
int main()
{
FILE* pf = fopen("E:\\test\\test2.txt", "r");
if (pf == NULL)
{
perror("fopen fail");
return 1;
}
//讀取文件:
fseek(pf, -3, SEEK_END);
printf("%d\n", ftell(pf));
//關(guān)閉文件
fclose(pf);
pf = NULL;
return 0;
}
七、文件緩沖區(qū):
文件緩沖區(qū)是內(nèi)存與硬盤(比如文件)進(jìn)行數(shù)據(jù)處理的時(shí)候,存在的一個(gè)區(qū)域,這個(gè)是先放在這個(gè)緩沖區(qū)中,等到裝滿緩沖區(qū)后才一起送到硬盤上,或者主動(dòng)刷新緩沖區(qū)來進(jìn)行傳輸。
主動(dòng)傳輸有(fflush或fclose)所以在文件打開后后面記得關(guān)閉。
柚子快報(bào)邀請(qǐng)碼778899分享:【C語言】文件操作
精彩鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。