C語(yǔ)言-I/O流設(shè)計(jì)實(shí)驗(yàn)
前言
文件的讀取和寫(xiě)入是使用的是
fscanf
和fprintf
兩個(gè)函數(shù),C語(yǔ)言中文件讀取的函數(shù)不止這兩個(gè)。文章中采用讀取文件的方式有兩個(gè),輸入行數(shù)和使用EOF
判斷文件末尾。%s
進(jìn)行讀取時(shí)不需要使用取址符&
,主要是用于輸入字符數(shù)組。
環(huán)境:CodeBlocks
文本閱讀軟件:NotePadd++
一、題目
實(shí)驗(yàn) I/O流設(shè)計(jì)
一、 實(shí)驗(yàn)?zāi)康模?/p>
熟悉文件流類(lèi)的使用,掌握文件的打開(kāi)、讀寫(xiě)、關(guān)閉操作。
二、 實(shí)驗(yàn)時(shí)間:
三、 實(shí)驗(yàn)地點(diǎn):
四、 實(shí)驗(yàn)內(nèi)容:
1.輸入任意多個(gè)學(xué)生的數(shù)據(jù)(學(xué)號(hào),姓名,成績(jī)),將數(shù)據(jù)存放在student.dat文件中,然后從該文件中讀出所有數(shù)據(jù)并顯示。
2.編程將2個(gè)文件的內(nèi)容連成一個(gè)文件。
3.編寫(xiě)程序,給一個(gè)文本文件加上行號(hào)后存到另外一個(gè)文件中。
五、實(shí)驗(yàn)要求:在上機(jī)前寫(xiě)出全部源程序;
六、實(shí)驗(yàn)結(jié)果分析:
二、代碼及效果
[1]. 第一問(wèn)
- 使用兩個(gè)文件指針,file1和file2指針?lè)謩e用于寫(xiě)文件和讀取文件,操作的都是student.dat文件。
- student.dat文件不需要提前創(chuàng)建
- 使用了一個(gè)結(jié)構(gòu)體數(shù)組存儲(chǔ)學(xué)生的學(xué)號(hào)、姓名、成績(jī)的信息。
- 在輸入學(xué)生數(shù),將學(xué)生數(shù)作為文件的第一行以便之后的讀取
- 在控制臺(tái)輸入每個(gè)學(xué)生信息的同時(shí),使用file1指針將當(dāng)前的學(xué)生數(shù)據(jù)存入文件
- 需要注意的是存入文件時(shí),不會(huì)自動(dòng)換行,所以需要在信息末尾添加一個(gè)換行符\n
- 因?yàn)樽x取文件時(shí)必須保證文件已存在,所以在關(guān)閉file1指針之后才使用fopen函數(shù)
- 之后就是根據(jù)第一行的學(xué)生個(gè)數(shù),讀取學(xué)生的信息并顯示
#include<stdio.h> struct student{ char number[20];//學(xué)號(hào) char name[20];//姓名 int score;//成績(jī) }stu[100];//學(xué)生結(jié)構(gòu)體數(shù)組 int main() { FILE *file1 = fopen("student.dat","w");//文件指針,寫(xiě) FILE *file2;//文件指針,讀 int i; int num = 0;//學(xué)生個(gè)數(shù) printf("學(xué)生個(gè)數(shù):"); scanf("%d",&num); fprintf(file1,"%d\n",num);//將學(xué)生個(gè)數(shù)放在文件首行 for(int i = 0;i < num;i++){//輸入學(xué)生信息 printf("第%d位學(xué)生\n",i+1); printf("學(xué)號(hào): "); scanf("%s", stu[i].number);//學(xué)號(hào) printf("姓名: "); scanf("%s", stu[i].name);//姓名 printf("成績(jī): "); scanf("%d", &stu[i].score);//成績(jī) //存入文件 fprintf(file1,"%s %s %d\n",stu[i].number,stu[i].name,stu[i].score); } fclose(file1);//關(guān)閉文件指針 file2 = fopen("student.dat","r");//讀取文件 fscanf(file2,"%d",&num);//讀取第一行的學(xué)生個(gè)數(shù) //printf("%d\n",num); for(int i = 0;i < num;i++){//顯示文件的數(shù)據(jù) //局部變量 char number[20]; char name[20]; int score; //獲取當(dāng)前行的數(shù)據(jù) fscanf(file2,"%s",number); fscanf(file2,"%s",name); fscanf(file2,"%d",&score); //打印 printf("第%d位學(xué)生: %s %s %d\n",i+1,number,name,score); } fclose(file2); return 0; }
[2]. 第二問(wèn)
- 剛開(kāi)始時(shí)student1.dat和student2.dat必須已存在,student3.dat是之后合并數(shù)據(jù)產(chǎn)生的文件不需要提前創(chuàng)建。
- 先是對(duì)student1.dat文件進(jìn)行讀取,存儲(chǔ)到結(jié)構(gòu)體數(shù)組stu1中
- 再對(duì)student2.dat文件進(jìn)行讀取,存儲(chǔ)到結(jié)構(gòu)體數(shù)組stu2中
- 將行數(shù)存到student3.dat文件的第一行
- 然后分別遍歷stu1和stu2結(jié)構(gòu)體數(shù)組,存入數(shù)據(jù)
#include<stdio.h> struct student{ char number[20];//學(xué)號(hào) char name[20];//姓名 int score;//成績(jī) }stu1[100],stu2[100];//學(xué)生結(jié)構(gòu)體數(shù)組 int main() { int i,num1,num2; char file_name1[20]; char file_name2[20]; char file_name3[20]; FILE *file1,*file2,*file3;//文件指針 file1 = fopen("student1.dat","r");//讀取文件1 file2 = fopen("student2.dat","r");//讀取文件2 file3 = fopen("student3.dat","w");//寫(xiě)入文件3 //獲取文件1內(nèi)容 fscanf(file1,"%d",&num1);//讀取第一行的學(xué)生個(gè)數(shù) for(int i = 0;i < num1;i++){ fscanf(file1,"%s",stu1[i].number); fscanf(file1,"%s",stu1[i].name); fscanf(file1,"%d",&stu1[i].score); //printf("第%d位學(xué)生: %s %s %d\n",i+1,stu1[i].number,stu1[i].name,stu1[i].score); } //獲取文件2內(nèi)容 fscanf(file2,"%d",&num2);//讀取第一行的學(xué)生個(gè)數(shù) for(int i = 0;i < num2;i++){ fscanf(file2,"%s",stu2[i].number); fscanf(file2,"%s",stu2[i].name); fscanf(file2,"%d",&stu2[i].score); //printf("第%d位學(xué)生: %s %s %d\n",i+1,stu2[i].number,stu2[i].name,stu2[i].score); } //寫(xiě)入文件3 fprintf(file3,"%d\n",num1+num2); for(int i = 0;i < num1;i++){//遍歷stu1數(shù)組 fprintf(file3,"%s %s %d\n",stu1[i].number,stu1[i].name,stu1[i].score); } for(int i = 0;i < num1;i++){//遍歷stu2數(shù)組 fprintf(file3,"%s %s %d\n",stu2[i].number,stu2[i].name,stu2[i].score); } //printf("已將student1.dat和student2.dat內(nèi)容存入student3.dat"); printf("復(fù)制成功!"); fclose(file1); fclose(file2); fclose(file3); return ; }
[3]. 第三問(wèn)
- EOF是文件結(jié)束的標(biāo)志,即End OF File,如果你讀取到的字符串等于EOF就表示讀取到了文件的末尾,就可以退出遍歷讀取的操作。
- 使用到了strcpy()函數(shù)用于復(fù)制字符數(shù)組的內(nèi)容到另一個(gè)字符數(shù)組,第一個(gè)參數(shù)表示的是目標(biāo)字符數(shù)組,第二個(gè)參數(shù)是需要復(fù)制原字符數(shù)組。
- 使用了死循環(huán)對(duì)文件進(jìn)行遍歷,使用一個(gè)局部的字符數(shù)組str存儲(chǔ)當(dāng)前行數(shù)據(jù)
- 當(dāng)執(zhí)行了if語(yǔ)句后,會(huì)做兩件事,一是將當(dāng)前行數(shù)據(jù)存儲(chǔ)到str數(shù)組,二是判斷是否讀取到文件末尾
- 當(dāng)讀取結(jié)束就提示,并break出死循環(huán)。
- 否則就將str字符數(shù)組復(fù)制給結(jié)構(gòu)體數(shù)組t的下標(biāo)為num的str字符數(shù)組中。
- 然后下標(biāo)num自加,之后對(duì)結(jié)構(gòu)體數(shù)組t的遍歷范圍就是[0, num)
- 遍歷結(jié)構(gòu)體數(shù)組,同時(shí)對(duì)文件stu2.dat文件進(jìn)行寫(xiě)入的操作。
- 由于下標(biāo)是從0開(kāi)始的,所以行數(shù)就等于i+1
#include<stdio.h> #include<string.h> struct text { char str[100];//字符數(shù)組,存儲(chǔ)每行的數(shù)據(jù) }t[100];//結(jié)構(gòu)體數(shù)組 int main(){ FILE *file1 = fopen("stu1.dat","r");//文件指針,讀 FILE *file2 = fopen("stu2.dat","w");//文件指針,寫(xiě) int i,num = 0; //讀 while(1){//遍歷文件stu1.dat char str[100]; if(fscanf(file1,"%s",str)==EOF){//若讀取到最后一行時(shí) printf("文件讀取結(jié)束!\n"); break; }else{ strcpy(t[num].str,str);//將字符數(shù)組復(fù)制到結(jié)構(gòu)體數(shù)組 num++;//定位到下一個(gè)結(jié)構(gòu)體 } } //寫(xiě)入文件 for(int i = 0;i < num;i++){//遍歷結(jié)構(gòu)數(shù)組t //printf("%s\n",t[i].str); fprintf(file2,"%d%s\n",i+1,t[i].str); } fclose(file1); fclose(file2); return 0; }
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
一起來(lái)學(xué)習(xí)C++中類(lèi)的this指針以使用
這篇文章主要為大家詳細(xì)介紹了C++中類(lèi)的this指針以使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03在Visual Studio Code中使用CSSComb格式化CSS文件的教程
這篇文章主要介紹了在Visual Studio Code中使用CSSComb格式化CSS文件,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03C++實(shí)現(xiàn)和電腦對(duì)戰(zhàn)三子棋實(shí)例
大家好,本篇文章主要講的是C++實(shí)現(xiàn)和電腦對(duì)戰(zhàn)三子棋實(shí)例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下2022-01-01C++實(shí)現(xiàn)線(xiàn)性表順序存儲(chǔ)的示例代碼
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)線(xiàn)性表順序存儲(chǔ)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下2023-03-03樹(shù)形結(jié)構(gòu)的3中搜索方式示例分享
樹(shù)的3中常見(jiàn)搜索方式,包括二叉樹(shù)方式(每一層只有0和1)、滿(mǎn)m叉樹(shù)(每一層都有0 到m - 1)、子集樹(shù),也稱(chēng)為全排列樹(shù),需要的朋友可以參考下2014-02-02C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(鏈表)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06