C語言-I/O流設計實驗

前言

文件的讀取和寫入是使用的是fscanffprintf兩個函數,C語言中文件讀取的函數不止這兩個。文章中采用讀取文件的方式有兩個,輸入行數和使用EOF判斷文件末尾。 %s進行讀取時不需要使用取址符&,主要是用於輸入字符數組。

環境CodeBlocks 文本閱讀軟件NotePadd++

一、題目

實驗 I/O流設計

一、 實驗目的:

熟悉文件流類的使用,掌握文件的打開、讀寫、關閉操作。

二、 實驗時間:

三、 實驗地點:

四、 實驗內容:

1.輸入任意多個學生的數據(學號,姓名,成績),將數據存放在student.dat文件中,然後從該文件中讀出所有數據並顯示。

2.編程將2個文件的內容連成一個文件。

3.編寫程序,給一個文本文件加上行號後存到另外一個文件中。

五、實驗要求:在上機前寫出全部源程序;

六、實驗結果分析:

二、代碼及效果

[1]. 第一問

在這裡插入圖片描述

在這裡插入圖片描述

  • 使用兩個文件指針,file1和file2指針分別用於寫文件和讀取文件,操作的都是student.dat文件。
  • student.dat文件不需要提前創建
  • 使用瞭一個結構體數組存儲學生的學號、姓名、成績的信息。
  • 在輸入學生數,將學生數作為文件的第一行以便之後的讀取
  • 在控制臺輸入每個學生信息的同時,使用file1指針將當前的學生數據存入文件
  • 需要註意的是存入文件時,不會自動換行,所以需要在信息末尾添加一個換行符\n
  • 因為讀取文件時必須保證文件已存在,所以在關閉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\n",num);//將學生個數放在文件首行
    for(int i = 0;i < num;i++){//輸入學生信息
        printf("第%d位學生\n",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\n",stu[i].number,stu[i].name,stu[i].score);
    }
    fclose(file1);//關閉文件指針
    file2 = fopen("student.dat","r");//讀取文件
    fscanf(file2,"%d",&num);//讀取第一行的學生個數
    //printf("%d\n",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\n",i+1,number,name,score);
    }
    fclose(file2);
    return 0;
}

[2]. 第二問

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

  • 剛開始時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\n",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\n",i+1,stu2[i].number,stu2[i].name,stu2[i].score);
    }
    //寫入文件3
    fprintf(file3,"%d\n",num1+num2);
    for(int i = 0;i < num1;i++){//遍歷stu1數組
        fprintf(file3,"%s %s %d\n",stu1[i].number,stu1[i].name,stu1[i].score);
    }
    for(int i = 0;i < num1;i++){//遍歷stu2數組
        fprintf(file3,"%s %s %d\n",stu2[i].number,stu2[i].name,stu2[i].score);
    }
    //printf("已將student1.dat和student2.dat內容存入student3.dat");
    printf("復制成功!");
    fclose(file1);
    fclose(file2);
    fclose(file3);
    return ;
}

[3]. 第三問

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

  • 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("文件讀取結束!\n");
            break;
        }else{
            strcpy(t[num].str,str);//將字符數組復制到結構體數組
            num++;//定位到下一個結構體
        }
    }
    //寫入文件
    for(int i = 0;i < num;i++){//遍歷結構數組t
        //printf("%s\n",t[i].str);
        fprintf(file2,"%d%s\n",i+1,t[i].str);
    }
    fclose(file1);
    fclose(file2);
    return 0;
}

總結

本篇文章就到這裡瞭,希望能給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!

推薦閱讀: