您好,登錄后才能下訂單哦!
這篇“C語言怎么實現I/O流設計”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“C語言怎么實現I/O流設計”文章吧。
文件的讀取和寫入是使用的是
fscanf
和fprintf
兩個函數,C語言中文件讀取的函數不止這兩個。文章中采用讀取文件的方式有兩個,輸入行數和使用EOF
判斷文件末尾。%s
進行讀取時不需要使用取址符&
,主要是用于輸入字符數組。
實驗 I/O流設計
一、 實驗目的:
熟悉文件流類的使用,掌握文件的打開、讀寫、關閉操作。
二、 實驗時間:
三、 實驗地點:
四、 實驗內容:
1.輸入任意多個學生的數據(學號,姓名,成績),將數據存放在student.dat文件中,然后從該文件中讀出所有數據并顯示。
2.編程將2個文件的內容連成一個文件。
3.編寫程序,給一個文本文件加上行號后存到另外一個文件中。
五、實驗要求:在上機前寫出全部源程序;
六、實驗結果分析:
使用兩個文件指針,file1和file2指針分別用于寫文件和讀取文件,操作的都是student.dat文件。
student.dat文件不需要提前創建
使用了一個結構體數組存儲學生的學號、姓名、成績的信息。
在輸入學生數,將學生數作為文件的第一行以便之后的讀取
在控制臺輸入每個學生信息的同時,使用file1指針將當前的學生數據存入文件
需要注意的是存入文件時,不會自動換行,所以需要在信息末尾添加一個換行符
因為讀取文件時必須保證文件已存在,所以在關閉file1指針之后才使用fopen函數
之后就是根據第一行的學生個數,讀取學生的信息并顯示
#include<stdio.h> struct student{ char number[20];//學號 char name[20];//姓名 int score;//成績 }stu[100];//學生結構體數組 int main() { FILE *file1 = fopen("student.dat","w");//文件指針,寫 FILE *file2;//文件指針,讀 int i; int num = 0;//學生個數 printf("學生個數:"); scanf("%d",&num); fprintf(file1,"%d ",num);//將學生個數放在文件首行 for(int i = 0;i < num;i++){//輸入學生信息 printf("第%d位學生 ",i+1); printf("學號: "); scanf("%s", stu[i].number);//學號 printf("姓名: "); scanf("%s", stu[i].name);//姓名 printf("成績: "); scanf("%d", &stu[i].score);//成績 //存入文件 fprintf(file1,"%s %s %d ",stu[i].number,stu[i].name,stu[i].score); } fclose(file1);//關閉文件指針 file2 = fopen("student.dat","r");//讀取文件 fscanf(file2,"%d",&num);//讀取第一行的學生個數 //printf("%d ",num); for(int i = 0;i < num;i++){//顯示文件的數據 //局部變量 char number[20]; char name[20]; int score; //獲取當前行的數據 fscanf(file2,"%s",number); fscanf(file2,"%s",name); fscanf(file2,"%d",&score); //打印 printf("第%d位學生: %s %s %d ",i+1,number,name,score); } fclose(file2); return 0; }
剛開始時student1.dat和student2.dat必須已存在,student3.dat是之后合并數據產生的文件不需要提前創建。
先是對student1.dat文件進行讀取,存儲到結構體數組stu1中
再對student2.dat文件進行讀取,存儲到結構體數組stu2中
將行數存到student3.dat文件的第一行
然后分別遍歷stu1和stu2結構體數組,存入數據
#include<stdio.h> struct student{ char number[20];//學號 char name[20];//姓名 int score;//成績 }stu1[100],stu2[100];//學生結構體數組 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");//寫入文件3 //獲取文件1內容 fscanf(file1,"%d",&num1);//讀取第一行的學生個數 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位學生: %s %s %d ",i+1,stu1[i].number,stu1[i].name,stu1[i].score); } //獲取文件2內容 fscanf(file2,"%d",&num2);//讀取第一行的學生個數 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位學生: %s %s %d ",i+1,stu2[i].number,stu2[i].name,stu2[i].score); } //寫入文件3 fprintf(file3,"%d ",num1+num2); for(int i = 0;i < num1;i++){//遍歷stu1數組 fprintf(file3,"%s %s %d ",stu1[i].number,stu1[i].name,stu1[i].score); } for(int i = 0;i < num1;i++){//遍歷stu2數組 fprintf(file3,"%s %s %d ",stu2[i].number,stu2[i].name,stu2[i].score); } //printf("已將student1.dat和student2.dat內容存入student3.dat"); printf("復制成功!"); fclose(file1); fclose(file2); fclose(file3); return ; }
EOF是文件結束的標志,即End OF File,如果你讀取到的字符串等于EOF就表示讀取到了文件的末尾,就可以退出遍歷讀取的操作。
使用到了strcpy()函數用于復制字符數組的內容到另一個字符數組,第一個參數表示的是目標字符數組,第二個參數是需要復制原字符數組。
使用了死循環對文件進行遍歷,使用一個局部的字符數組str存儲當前行數據
當執行了if語句后,會做兩件事,一是將當前行數據存儲到str數組,二是判斷是否讀取到文件末尾
當讀取結束就提示,并break出死循環。
否則就將str字符數組復制給結構體數組t的下標為num的str字符數組中。
然后下標num自加,之后對結構體數組t的遍歷范圍就是[0, num)
遍歷結構體數組,同時對文件stu2.dat文件進行寫入的操作。
由于下標是從0開始的,所以行數就等于i+1
#include<stdio.h> #include<string.h> struct text { char str[100];//字符數組,存儲每行的數據 }t[100];//結構體數組 int main(){ FILE *file1 = fopen("stu1.dat","r");//文件指針,讀 FILE *file2 = fopen("stu2.dat","w");//文件指針,寫 int i,num = 0; //讀 while(1){//遍歷文件stu1.dat char str[100]; if(fscanf(file1,"%s",str)==EOF){//若讀取到最后一行時 printf("文件讀取結束! "); break; }else{ strcpy(t[num].str,str);//將字符數組復制到結構體數組 num++;//定位到下一個結構體 } } //寫入文件 for(int i = 0;i < num;i++){//遍歷結構數組t //printf("%s ",t[i].str); fprintf(file2,"%d%s ",i+1,t[i].str); } fclose(file1); fclose(file2); return 0; }
以上就是關于“C語言怎么實現I/O流設計”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。