一、实验目的:

练习用UNIX I/O进行文件读写的编程方法,用UNIX I/O函数管理文本信息、二进制数据、结构体数据,掌握UNIX I/O的基本编程方法。练习测时函数使用,通过测量UNIX I/O函数运行时间,建立UNIX I/O API函数基本开销的概念。

二、实验内容与要求:

先创建用户家目录下创建文件名为“姓名+学号+04”的子目录,作为本次实验目录,本次实验的所有代码都放到该目录下,要求将所有源代码与数据文件打包成文件”学号-姓名-lab4.tar.gz”, 压缩包与实验报告分别上传到指定目录下。

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

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

附录:使用prof/gprof测量程序运行时间

Linux/Unix环境提供了prof/gprof工具来收集一个程序各函数的执行次数和占用CPU时间等统计信息,使用prof/gprof工具查找程序性能问题,要求编译命令添加-p选项(prof)或-pg选项(gprof),程序执行时就会产生执行跟踪文件mon.out(或gmon.out),再运行prof(或gprof)程序读取跟踪数据,产生运行报告。现在用gprof对以下程序各函数运行性能(占用CPU时间)进行测量。先输入程序源代码:

$ cat  multiply.c
#include <stdio.h>
int fast_multiply(x,  y)
{ return x * y;
}
int slow_multiply(x, y)
{ int i, j, z; for (i = 0, z = 0; i < x; i++) z = z + y; return z;
}
int main(int argc, char *argv[])
{ int i,j; int x,y; for (i = 0; i < 2000; i ++) { for (j = 0; j <  3000 ; j++) { x = fast_multiply(i, j); y = slow_multiply(i, j); } } printf("x=%d, y=%d\n", x, y); return 0;
}

然后编译和执行该程序,检查是否函数性能跟踪数据文件gmon.out:
$ gcc -pg -o multiply multiply.c -pg -g
$ ./multiply
x=5995001, y=5995001
$ ls gmon.out
gmon.out
最后,用gprof命令产看各函数执行时间:
$ gprof multiply gmon.out
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls us/call us/call name
99.44 14.11 14.11 6000000 2.35 2.35 slow_multiply
0.42 14.17 0.06 main
0.14 14.19 0.02 6000000 0.00 0.00 fast_multiply
在这里,slow_multipy和fast_multiply执行600000次所花运行时间为14.11s和0.02秒。

  • 任务4:在Linux系统环境下,编写程序task44.c,对一篇英文文章文件的英文单词词频进行统计。
    (1)以“单词:次数”格式输出所有单词的词频(必做)
    (2)以“单词:次数”格式、按词典序输出各单词的词频(选做)
    (3)以“单词:次数”格式输出出现频度最高的10个单词的词频
    例如,若某个输入文件内容为:
    GNU is an operating system that is free software—that is, it respects users’ freedom.
    The development of GNU made it possible to use a computer without software that would trample your freedom.
    则输出应该是:
    GNU:2
    is:3
    it:2
    ……

提示:可以调用字符串处理函数、二叉树处理函数等库函数

三、涉及实验的相关情况介绍(包含使用软件或实验设备等情况):

安装Linux操作系统的计算机

四、报告内容(给出每个任务的要求、设计思想、源代码,后接编译过程、测试数据与运行结果截图)

  • 任务一:
    源代码:
#include<stdio.h>
#include<string.h>
#define MAXSIZE 200
int main()
{FILE *fp1, *fp2;char buf[MAXSIZE];char cha[] = "计算机与网络安全学院";if ((fp1 = fopen("student.txt", "r")) == NULL){printf("Open Failed!");}if ((fp2 = fopen("csStudent.txt", "a+")) == NULL){printf("Open Failed!");}while (!feof(fp1)){fgets(buf, MAXSIZE, fp1);if (strstr(buf, cha)){fputs(buf, fp2);}}fclose(fp1);fclose(fp2);return 0;
}

运行结果:

  • 任务二:
    源代码:
#include<stdio.h>
#define N 5
struct _subject {char sno[20];     //学号char name[20];   //姓名float chinese;     //语文成绩float math;        //数学成绩float english;       //英语成绩
}subject[N], subject2[N];int main()
{FILE *fp;int i;fp = fopen("data.txt", "a+");for (i = 0; i < N; i++){printf("该学生的学号为:\n");scanf("%s", &subject[i].sno);printf("该学生的姓名为:\n");scanf("%s", &subject[i].name);printf("该学生的语文成绩为:\n");scanf("%f", &subject[i].chinese);printf("该学生的数学成绩为:\n");scanf("%f", &subject[i].math);printf("该学生的英语成绩为:\n");scanf("%f", &subject[i].english);fwrite(&subject[i], sizeof(struct _subject), 1, fp);}fclose(fp);fp = fopen("data.txt", "r");for (i = 0; i < N; i++){fread(&subject2[i], sizeof(struct _subject), 1, fp);}for (i = 0; i < N; i = i + 2){printf("学号:%s 姓名:%s 语文成绩:%.1f 数学成绩:%.1f 英语成绩:%.1f\n", subject2[i].sno, subject2[i].name, subject2[i].chinese, subject2[i].math, subject2[i].english);}return 0;
}

运行结果:

  • 任务四:
    源代码:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>int main()
{int fd,i,j,k,wordsCount=0,wordNum[200],flag1,flag2;char c,temp[20],words[200][20];fd=open("text44.txt",O_RDONLY,0);for(i=0;i<200;i++){flag1=0;for(j=0;j<20;j++){read(fd,&c,sizeof(char));if((c>=65&&c<=90)||(c>=97&&c<=122)) temp[j]=c;else if(c=='\0'){flag1=2;break;}else{temp[j]='\0';flag1=1;break;}}if(flag1==2) break;if(flag1==1){flag2=0;for(k=0;k<wordsCount;k++){if(strcmp(temp,words[k])==0){wordNum[k]++;flag2=1;break;}}if(flag2==0){strcpy(words[wordsCount],temp);wordNum[wordsCount]=1;wordsCount++;}}}printf("输出所有单词的词频:\n");for(i=0;i<wordsCount;i++){printf("%s:%d\n",words[i],wordNum[i]);}j=0;for(k=1;k<wordsCount;k++){if(wordNum[k]>wordNum[j]) j=k;}wordNum[j]=0;printf("输出出现频度最高的10个单词的词频:\n");for(i=0;i<10;i++){j=0;for(k=1;k<wordsCount;k++){if(wordNum[k]>wordNum[j]) j=k;}printf("%s:%d\n",words[j],wordNum[j]);wordNum[j]=0;}
}

运行结果:

五、实验分析和总结(任务3要求进行分析)
学会了文件的读取操作.加强了对C语言语法的理解.

Linux I/O编程相关推荐

  1. Linux下Socket编程

    Linux下Socket编程    网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的S ...

  2. [转]Linux 的多线程编程的高效开发经验

    Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别.不注意这些 Linux 上的一些开发陷阱,常常会导致程序问题不穷,死锁不断.本文中我们 ...

  3. Linux环境高级编程函数,Linux环境高级编程--出错处理(CLStatus)

    很多程序库对外提供若干类,每个方法出错时如何告知调用者是否出错,以及出错码(在Linux上在error.h中的全局errno就是保存我们Linux程序执行的出错码的)?方法很多,为了简化起见,函数将返 ...

  4. 【linux草鞋应用编程系列】_4_ 应用程序多线程

    一.应用程序多线程 当一个计算机上具有多个CPU核心的时候,每个CPU核心都可以执行代码,此时如果使用单线程,那么这个线程只能在一个 CPU上运行,那么其他的CPU核心就处于空闲状态,浪费了系统资源: ...

  5. Linux下高性能网络编程中的几个TCP/IP选项

    Linux下高性能网络编程中的几个TCP/IP选项 转自:http://blog.chinaunix.net/u/12592/showart.php?id=2064847 最近在新的平台上测试程序,以 ...

  6. 【linux草鞋应用编程系列】_2_ 环境变量和进程控制

    一. 环境变量 应用程序在执行的时候,可能需要获取系统的环境变量,从而执行一些相应的操作. 在linux中有两种方法获取环境变量,分述如下. 1.通过main函数的参数获取环境变量 main函数的多种 ...

  7. linux下多进程编程简介

    两年前的文章,拿过来充充门面. ------------------------ linux下多进程编程简介 ( 作者:mikespook | 发布日期:2002-12-8 | 浏览次数:272 ) ...

  8. [zz]Linux 下 socket 编程示例

    本示例为 Client/Server 结构,通过代码演示 Client 如何建立连接,并向远程端发送数据:Server 端如何侦听系统连接请求,接收请求并建立连接,进而获取客户端发来的数据.代码虽短, ...

  9. 《Linux高性能服务器编程》——导读

    前 言 为什么要写这本书 目前国内计算机书籍的一个明显弊病就是内容宽泛而空洞.很多书籍长篇大论,恨不得囊括所有最新的技术,但连一个最基本的技术细节也无法解释清楚.有些书籍给读者展现的是网络上随处可见的 ...

  10. Linux环境多线程编程基础设施

    Linux环境多线程编程基础设施 来源:Yebangyu 本文介绍多线程环境下并行编程的基础设施.主要包括: Volatile __thread Memory Barrier __sync_synch ...

最新文章

  1. 团队软件开发第一次冲刺(二)
  2. PAT甲级1038 Recover the Smallest Number (30 分):[C++题解]贪心、排列成最小的数、字符串
  3. hibernate 中id生成策略
  4. redis springmvc mysql_redis和mysql怎么一起在springmvc里面
  5. 阿里资深技术专家崮德:8 个影响我职业生涯的重要技能
  6. Android 数据库综述(一) 数据库片的升级与数据的迁移操作
  7. Markdown入门指导
  8. python toimage函数 -baijiahao_财码Python管理会计小实验成本性态分析So Easy
  9. 大数据杀熟行为10月1日起明令禁止;阿里一号工程“犀牛制造”正式亮相;iOS 14 正式版发布 | 极客头条...
  10. Android编程之DialogFragment源码详解(一)
  11. C++实现演讲比赛小项目
  12. TensorFlow2.0学习使用笔记
  13. C语言编程实例——百钱买百鸡
  14. Chapter9:Simulink建模与仿真
  15. Win10下NTFS分区变RAW修复的一种错误方法
  16. 唯一插件化Replugin源码及原理深度剖析--唯一Hook点原理
  17. 学习笔记(2):基于.NET/C#开发工控上位机编程基础-PLC电气工程师为什么要学习工控上位机
  18. 今日只为你狂欢-----JAVA线程总结(零基础入门)
  19. Excel 经纬度互相转换
  20. 我为何在 CSDN 乐在其中

热门文章

  1. 微信小程序播放视频卡顿问题
  2. 阿里天池比赛——食物声音识别
  3. java对齐_java字符串对齐方法
  4. ESP32开发二_LED闪烁灯
  5. excel中录制宏只执行一半的命令,没有执行全部如何解决?
  6. JavaScript基础复习之数据类型,解读数据类型不为人知的一面
  7. 神话人物马化腾的“神话”
  8. IT项目经理如何正确做好项目实施
  9. JVM中的本地内存追踪NMT(Native Memory Tracking)
  10. 与君初相识之Linux与Java SE