实验代码下载地址:
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