C语言-I/O流设计实验

 更新时间:2021年07月08日 11:05:40   作者:小狐狸FM  
编程语言的I/O类库中常常使用流这个抽象的概念,它代表任何有能力产生数据的数据源对象或时有能力接收数据的接收端对象,本文为大家介绍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;
}

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • C语言实现经典windows游戏扫雷的示例代码

    C语言实现经典windows游戏扫雷的示例代码

    今天我们会用C语言实现一个经典的windows小游戏:扫雷。扫雷是一款单机小游戏,每次通关最高难度的关卡都会开心好一阵。现在学会了C语言,总算可以自己实现扫雷了。话不多说,咱们开始吧
    2022-10-10
  • C语言之如何用isspace()和ungetc()实现前导空白字符过滤

    C语言之如何用isspace()和ungetc()实现前导空白字符过滤

    这篇文章主要介绍了C语言如何用isspace()和ungetc()实现前导空白字符过滤问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • C语言程序的编译与预处理详解

    C语言程序的编译与预处理详解

    这篇文章主要介绍了C语言程序的编译与预处理,包括介绍了C和C++混合编程的情况,需要的朋友可以参考下,希望能够给你带来帮助
    2021-10-10
  • C++结构体中变长数组的使用问题分解刨析

    C++结构体中变长数组的使用问题分解刨析

    变长数组在C++中指的是集合(也叫容器)如vector就是C语言中,所有的数组都不定长,没有下标越界的概念,数组实质就是一个指针(由数组名充当)因此C语言中数组的长度没有任何意义平常在C语言中讲的不定长数组,其实就是指针
    2022-08-08
  • 介绍C语言程序中的注释等辅助语句如何使用

    介绍C语言程序中的注释等辅助语句如何使用

    C语言中分为单行注释和多行注释:单行注释 以 // 开始的这一行文本,可能不被编译器所支持;多行注释从 /* 到 */之间的所有文本,不支持嵌套,下面让我们详细来了解
    2022-04-04
  • C语言如何输出中文

    C语言如何输出中文

    这篇文章主要介绍了C语言如何输出中文问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • VS Code安装及C、C++环境配置详细教程(Windows系统)

    VS Code安装及C、C++环境配置详细教程(Windows系统)

    这篇文章主要介绍了VS Code安装及C、C++环境配置详细教程(Windows系统),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • c语言 数据存储与原码 反码 补码详细解析

    c语言 数据存储与原码 反码 补码详细解析

    不知道你是否和我一样好奇,学习编程语言的同时想,各个数据类型是怎样在我们的内存中储存的呢,如果你仔细深入了解的话,你会了解其中的乐趣,了解科学家们的伟大,了解c语言
    2022-02-02
  • c++11&14-STL要点汇总

    c++11&14-STL要点汇总

    这篇文章主要介绍了c++11&14中的STL要点,文中代码简单易懂,方便大家更好的学习参考,感兴趣的朋友可以了解下
    2020-06-06
  • 深入探讨C++ OpenCV如何实现图像矫正

    深入探讨C++ OpenCV如何实现图像矫正

    这篇文章主要为大家详细介绍了C++ OpenCV如何实现简单的图像矫正功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03

最新评论