C语言I/O流设计实例分析

这篇文章主要介绍了C语言I/O流设计实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言I/O流设计实例分析文章都会有所收获,下面我们一起来看看吧。

网站的建设创新互联专注网站定制,经验丰富,不做模板,主营网站定制开发.小程序定制开发,H5页面制作!给你焕然一新的设计体验!已为茶楼设计等企业提供专业服务。

    前言

    文件的读取和写入是使用的是fscanffprintf两个函数,C语言中文件读取的函数不止这两个。文章中采用读取文件的方式有两个,输入行数和使用EOF判断文件末尾。 %s进行读取时不需要使用取址符&,主要是用于输入字符数组。

    环境CodeBlocks 文本阅读软件NotePadd++

    一、题目

    实验 I/O流设计

    一、 实验目的:

    熟悉文件流类的使用,掌握文件的打开、读写、关闭操作。

    二、 实验时间:

    三、 实验地点:

    四、 实验内容:

    1.输入任意多个学生的数据(学号,姓名,成绩),将数据存放在student.dat文件中,然后从该文件中读出所有数据并显示。

    2.编程将2个文件的内容连成一个文件。

    3.编写程序,给一个文本文件加上行号后存到另外一个文件中。

    五、实验要求:在上机前写出全部源程序;

    六、实验结果分析:

    二、代码及效果

    [1]. 第一问

    C语言I/O流设计实例分析

    C语言I/O流设计实例分析

    • 使用两个文件指针,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;
    }

    [2]. 第二问

    C语言I/O流设计实例分析

    C语言I/O流设计实例分析

    C语言I/O流设计实例分析

    C语言I/O流设计实例分析

    C语言I/O流设计实例分析

    • 刚开始时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 ;
    }

    [3]. 第三问

    C语言I/O流设计实例分析

    C语言I/O流设计实例分析

    C语言I/O流设计实例分析

    C语言I/O流设计实例分析

    • 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流设计实例分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C语言I/O流设计实例分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注创新互联行业资讯频道。

    名称栏目:C语言I/O流设计实例分析
    链接URL:https://www.cdcxhl.com/article30/gooiso.html

    成都网站建设公司_创新互联,为您提供网站制作品牌网站制作响应式网站网页设计公司网站收录企业网站制作

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

    成都定制网站建设