Linux文件I/O实验报告

实验代码下载地址:
https://download.youkuaiyun.com/download/Qingyuyuehua/16305028

任务1

在当前用户目录下创建数据文件student.txt,文件的内部信息存储格式为Sname:S#:Sdept:Sage:Ssex,即“姓名:学号:学院:年龄:性别”,每行一条记录,输入不少于10条学生记录,其中包括学生本人记录。编写程序task41.c,从文件中查找Sdept字段值为“计算机与网络安全学院”的文本行,输出到文件csStudent.txt中,保存时各字段顺序调整为S#:Sname:Sage: Ssex:Sdept。提示:从终端读入一个文本行到字符串 char buf[MAXSIZE]可调用函数可调用函数:“fgets(buf, MAXSIZE, stdin);”,其中stdin是表示键盘输入设备的文件指针。

代码:

#include<stdio.h>
#include<string.h>

#define SEARCH_EDU "计算机与网络安全学院" //待查学院
#define SIZE 10 //学生人数
#define FILE_NAME "./student.txt" //打开文件名
#define FILE_OUT "./csStudent.txt" //输出文件名
#define MAXSIZE 1024

typedef struct STUDENT
{
   
    char name[20];//姓名
    char sno[20];//学号
    char edu[50];//学院
    char age[4];//年龄
    char sex[4];//性别
}Student;

int main()
{
   
    Student students[SIZE];
    FILE* stuFile = fopen(FILE_NAME,"r"); 
    FILE* outFILE = fopen(FILE_OUT,"w");
    int i,j;
    char buf[MAXSIZE];
    //读取文件学生信息到内存
    for(int i = 0; i < SIZE; i++)
    {
   
        j = 0;
        fgets(buf,MAXSIZE,stuFile);
        sscanf(buf, "%[^:]:%[^:]:%[^:]:%[^:]:%[^\n]\n", students[i].name,
        students[i].sno,students[i].edu,students[i].age,students[i].sex);
    }
    //打印内存中所有学生数据到屏幕,检验错误
    for(int i = 0; i < SIZE; i++)
    {
   
        printf("%s %s %s %s %s\n", students[i].name,
        students[i].sno,students[i].edu,students[i].age,students[i].sex);
    }
    //输出指定学院的学生到文件
    for(int i = 0; i < SIZE; i++)
    {
   
        if(strcmp(students[i].edu,SEARCH_EDU) == 0)
        {
   
            fprintf(outFILE,"%s:%s:%s:%s:%s\n", students[i].sno,
            students[i].name,students[i].age,students[i].sex,students[i].edu);
        }
    }
}

在这里插入图片描述
在这里插入图片描述

任务2

调用Unix I/O库函数,编写程序task42.c,从键盘读入5个学生的成绩信息,包括学号、姓名、语文、数学、英语,成绩允许有一位小数,存入一个结构体数组,结构体定义为:
typedef struct _subject {
   
char sno[20];   //学号
char name[20];  //姓名
float chinese;   //语文成绩
float math;      //数学成绩
float english;   //英语成绩
} subject;
将学生信息,逐条记录写入数据文件data,最后读回第1、3、5条学生成绩记录,显示出来,检查读出结果是否正确。
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>

#define SIZE 5

typedef struct _subject
{
   
    char sno[20];
    char name[20];
    float chinese;
    float math;
    float english;
}subject;

int main()
{
   
    subject subs[SIZE]; 
    printf("请输入五位学生的信息:\n");
    int j;
    for(j = 0; j < SIZE; j++)
    {
   
        scanf("%s",subs[j].sno);
        scanf("%s",subs[j].name);
        scanf("%f",&subs[j].chinese);
        scanf("%f",&subs[j].math);
        scanf("%f",&subs[j].english);
    }

    int fd,i;
    fd = open("data",O_WRONLY|O_CREAT|O_TRUNC,0777);
    for(i=0; i<SIZE; i++)
        write(fd,(void*)&subs[i],sizeof(subject));
    close(fd);

    subject sub;
    fd = open("data",O_RDONLY,0);
    for(i = 0; i < SIZE; i++)
    {
   
        read(fd,(void*)&sub,sizeof(subject));
        if(i == 0 || i == 2 || i == 4)
            printf("%s  %s  %f  %f  %f\n",sub.sno,sub.name,sub.chinese,
            sub.math,sub.english);
    }
    close(fd);
}

在这里插入图片描述

任务3

在Linux环境下,可以调用库函数gettimeofday测量一个代码段的执行时间,请写一个程序task43.c,测量read、write、fread、fwrite函数调用所需的执行时间,并与prof/gprof工具测的结果进行对比,看是否基本一致。并对四个函数的运行时间进行对比分析。提示:由于一次函数调用时间太短,测量误差太多,应测量上述函数多次(如10000次)运行的时间,结果才会准确。
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdlib.h>
#include<sys/time.h>

int main()
{
   
    int fd1;//文件标识符
    FILE *fp;//文件指针
    char buf;//缓冲区
    struct timeval time_start;//开始测试时间
    struct timeval time_end;//结束测试时间
    //测试输入:read系
    fd1 = open("test.txt",O_RDONLY);
    fp = fopen("file.txt", "r");
    //测试read()
    gettimeofday(&time_start,NULL);
    read(fd1,&buf,1);
    gettimeofday(&time_end,NULL);
    double wa= time_end.tv_usec - time_start.tv_usec;
    double sa= time_end.tv_sec - time_start.tv_sec;
    double ms = wa / 1000.0 + sa * 1000.0;
    printf("read() %lfms\n",ms);
    //测试fread()
    gettimeofday(&time_start,NULL);
    fread(&buf, 1, 1, fp);
    gettimeofday(&time_end,NULL);
    wa= time_end.tv_usec - time_start.tv_usec;
    sa= time_end.tv_sec - time_start.tv_sec;
    ms = wa / 1000.0 + sa * 1000.0;
    printf("fread() %lfms\n",ms);
    close(fd1);
    fclose(fp);
    //测试输出:write系
    fd1 = open("test.txt",O_WRONLY,0777);
    fp = fopen("file.txt", "w");
    //测试write()
    gettimeofday(&time_start,NULL);
    write(fd1,&buf,1);
    gettimeofday(&time_end,NULL);
    wa= time_end.tv_usec - time_start.tv_usec;
    sa= time_end.tv_sec - time_start.tv_sec;
    ms = wa / 1000.0 + sa 
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值