Linux I/O编程 实验内容

2023-11-13

一、实验目的:

练习用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是表示键盘输入设备的文件指针。

代码:

#include<stdio.h>
#include<string.h>
#define MAXSIZE 200
int main()
{
	FILE* fp1, * fp2;
	char buf[MAXSIZE];
	char check[] = "计算机与网络安全学院";
	if ((fp1 = fopen("student.txt", "r")) == NULL)
	{
		printf(" Open Failed!");
		return 0;
	}
	if ((fp2 = fopen("csStudent.txt", "a+")) == NULL)
	{
		printf(" Open Failed!");
		return 0;
	}
	while (!feof(fp1))//文本结束时退出循环
	{
		fgets(buf, MAXSIZE, fp1);//一行行读入

		if (strstr(buf, check))//判断是否属于“计算机与网络安全学院”
		{
			char* a[6];
			char buffer[100];
			a[0] = strtok(buf, ":");//切割字符串成五部分
			a[1] = strtok(NULL, ":");
			a[2] = strtok(NULL, ":");
			a[3] = strtok(NULL, ":");
			a[4] = strtok(NULL, ":");
			a[4][3] = 0;//将换行符去掉
			sprintf(buffer, "%s:%s:%s:%s:%s\n", a[1], a[0], a[3], a[4], a[2]);//格式化写入buffer

			fputs(buffer, fp2);//将buffer写入文本csStudent
		}
	}
	fclose(fp1);
	fclose(fp2);
	return 0;
}

在这里插入图片描述

任务2. 调用Unix I/O库函数,编写程序task42.c,从键盘读入5个学生的成绩信息,包括学号、姓名、语文、数学、英语,成绩允许有一位小数,存入一个结构体数组,结构体定义为:

typedef struct _subject {
	char sno[20];	   //学号
	char name[20];   //姓名
	float chinese;	   //语文成绩
	float math;		//数学成绩
	float english;	   //英语成绩
}  subject;

代码:

#include<stdio.h>
#include"wrapper.h"
typedef struct _subject {
	char sno[20];	   //学号
	char name[20];    //姓名
	float chinese;	   //语文成绩
	float math;	  //数学成绩
	float english;	   //英语成绩
}  subject;

void main() {
	int fd = open("task42.txt", O_RDWR | O_CREAT | O_APPEND, 0777);
	subject student[5];
	subject stu[3];
	int i;
	for (i = 0; i < 5; i++) {
		scanf("%s%s%f%f%f", student[i].sno, student[i].name, &student[i].chinese, &student[i].math, &student[i].english);
		write(fd, &student[i], sizeof(student[i]));
	}
	lseek(fd, 0, SEEK_SET);
	read(fd, &stu[0], sizeof(subject));
	lseek(fd, sizeof(subject), SEEK_CUR);
	read(fd, &stu[1], sizeof(subject));
	lseek(fd, sizeof(subject), SEEK_CUR);
	read(fd, &stu[2], sizeof(subject));
	for (i = 0; i < 3; i++) {
		printf("%s %s %.1f %.1f %.1f\n", stu[i].sno, stu[i].name, stu[i].chinese, stu[i].math, stu[i].english);
	}

}

在这里插入图片描述

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

代码:

#include<stdio.h>
#include"wrapper.h"
//struct  timeval{

//       long  tv_sec;  /*秒*/

//       long  tv_usec; /*微秒*/

//};
int main() {
	struct timeval begin, end;
	double write_time , fwrite_time , read_time , fread_time;
	int i;
	char buf[100]="you are good!";
	int fd = open("test.txt",O_RDWR|O_CREAT|O_APPEND,0777);

	gettimeofday(&begin,NULL);//10000次write
	for(i =0;i<10000;i++){
		write(fd,buf,1);
	}
	gettimeofday(&end,NULL);
	write_time = end.tv_usec-begin.tv_usec;
	printf("10000次write的write_time =%.1lf微秒\n",write_time);

	
	lseek(fd,0,SEEK_SET);
	gettimeofday(&begin,NULL);//10000次read
	for(i =0;i<10000;i++){
		read(fd,buf,1);
	}
	gettimeofday(&end,NULL);
	read_time = end.tv_usec-begin.tv_usec;
	printf("10000次read的read_time =%.1lf微秒\n",read_time);
	close(fd);

	FILE* fp1 = fopen("test.txt","w+");
	gettimeofday(&begin,NULL);//10000次fwrite
	for(i =0;i<10000;i++){
		fwrite(buf,1,1,fp1);
	}
	gettimeofday(&end,NULL);
	fwrite_time = end.tv_usec-begin.tv_usec;
	printf("10000次fwrite的fwrite_time =%.2lf微秒\n",fwrite_time);
	fclose(fp1);

	FILE* fp2 = fopen("test.txt","r+");
	gettimeofday(&begin,NULL);//10000次fread
	for(i =0;i<10000;i++){
		fread(buf,1,1,fp2);
	}
	gettimeofday(&end,NULL);
	fread_time = end.tv_usec-begin.tv_usec;
	printf("10000次fread的fread_time =%.2lf微秒\n",fread_time);

	return 0;
}

fwrite和fread有自己的缓冲区,直到缓冲区写满或者指针指向文本结束位置时,才会进行一次I/O操作,大大减少了write和read函数在内核空间和用户空间之间的转换,这种转换会带来非常大的cpu开销,所以前者的效率更高。(截图如下:)
在这里插入图片描述
附录: multiply,使用prof/gprof测量程序运行时间

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

#include <stdio.h>
int multiply_quick( int x, int y)
{
	return x * y;
}
int multiply_slow(int x,int  y)
{
	int i, j, k;
	for (i = 0, k = 0; i < x; i++)
		k = k + y;
	return k;
}
int main(int argc, char* argv[])
{
	int i, j;
	int x, y;
	for (i = 0; i < 1000; i++) {
		for (j = 0; j < 1000; j++) {
			x = multiply_quick(i, j);
			y = multiply_slow(i, j);
		}
	}
	printf("x=%d, y=%d\n", x, y);
	return 0;
}

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

multipy_slow花费了0.98s,multipy_quick花费了0.01s

任务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
……

代码:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>
#include<malloc.h>
#include<string.h>
//#include<algorithm>
//#include <unistd.h>
#define MAXSIZE 200
typedef struct Word {
	char word[30];		 //设单词最长为30个字母
	int count;			//该单词出现的次数
}WordNode;
typedef struct article {
	WordNode Word[MAXSIZE]; //单词的集合
	int num;			//这篇文章不同的英文单词的种数
}Article;
void Insert_word(char* temp, Article* a) {
	if (a->num == MAXSIZE) {
		printf("单词表已经满,输入失败\n");
		return;
	}
	if (temp == NULL)
		return;
	if (a->num == 0) {		//情况1:单词表里暂时还没有保存单词
		a->Word[0].word[0] = '\0';
		strcpy(a->Word[0].word, temp);
		a->Word[0].count = 1;
		a->num = 1;
	}
	else {
		int i;
		for (i = 0; i < a->num; i++) {
			if (strcmp(temp, a->Word[i].word) == 0) {//情况2:该单词已经存在
				a->Word[i].count++;
				return;
			}
		}
		a->Word[a->num].word[0] = '\0';
		strcpy(a->Word[a->num].word, temp);			//情况2:该单词是首次输入
		a->Word[a->num].count = 1;
		a->num++;
	}
}
void divide_word(char* temp) {
	int i;
	if (temp == NULL) {
		return;
	}

	for (i = 0; temp[i] != '\0'; i++) {
		if (!((temp[i] >= 'A' && temp[i] <= 'Z') || (temp[i] >= 'a' && temp[i] <= 'z'))) {

			temp[i] = ' ';
		}

	}
}

void paixu(Article* article) {
	int i, j;
	for (i = 0; i < article->num - 1; i++) {
		for (j = 0; j < article->num - 1 - i; j++) {
			if (article->Word[j].count < article->Word[j + 1].count) {
				WordNode temp = article->Word[j];
				article->Word[j] = article->Word[j + 1];
				article->Word[j + 1] = temp;
			}
		}
	}
}
void main()
{
	Article article = {.num=0};
	char temp[1000];
	int i;
	FILE* fd = fopen("./task44.txt", "r");
	while (!feof(fd)) {
		char* p;
		fscanf(fd, "%s", temp);
		divide_word(temp);		//有可能一次读入不止一个单词,所以要分隔开

		p = strtok(temp, " ");	//strtok把temp分成多个字符串
		do {
			Insert_word(p, &article);
		} while ((p = strtok(NULL, " ")) != NULL);//合适调整循环跳出条件

	}
	printf("按词典序输出,所有单词的词频如下:\n");
	for (i = 0; i < article.num; i++) {
		printf("%s:%d\n", article.Word[i].word, article.Word[i].count);
	}
	printf("\n最高词频的前十个单词:\n");
	paixu(&article);			//使用稳定排序法,才能符合题目要求
	for (i = 0; i < 10; i++) {
		printf("%s:%d\n", article.Word[i].word, article.Word[i].count);
	}

}

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

后记

第一次写C for Linux ,特别是gcc 编译器特别不习惯,出现了很多没见过的问题。

第一个就是

段错误 (核心已转储)

这种字样,一般就是相当于vs上数组越界,访问到不合理的内存这种情况,多去留意下自己write和read这些I/O类的函数,一行行仔细比对,一定能找到问题所在。

第二个就是c语言很久没写过了,很多语法都不记得了。还犯了在结构体里初始化char数组的小失误。

第三个就是某些头文件在gcc编译器里找不到,只能自己编写成库文件,否则就只能换一个函数来使用。

收获:
read和write是要进行内核模式和用户模式之间的切换的,这种切换会带来非常大的cpu开销,所以相比之下,fwrite和fread有自己的缓冲区,缓冲区满了或文件指针结束了才进行一次读出/写入操作,效率更高。(都是二进制的读写,不适合文本数据)

fgets和fputs,可以一行行的读写,适合文本数据
当不足n个字符时,读到\n就停止,会在末尾增添\0。如果刚刚好n个字符,优先读入\0,不读入\n。

read和write:(参数)

(int fd, const void *buf, size_t nbyte)
文件描述符,缓冲区,指定I/O字节数

fread和fwrite: (参数)

(const void *ptr, size_t size, size_t nmemb, FILE *stream)
目标元素数组的指针,每个元素大小(字节),元素个数(字节),文本指针

fgets和fputs: (参数)

(char *str, int n, FILE *stream)
字符数组的指针,读取的最大字符数,文本指针

注意:FILE * 类型和int类型不相等

编译.c文件时,命令中添加-p选项(prof)或-pg选项(gprof),程序执行时就会产生执行跟踪文件mon.out(或gmon.out),再运行prof(或gprof)程序读取跟踪数据,产生运行报告。

strtok函数可以把字符串切割成若干个字符串。

任务四其实可以用字典树来做,但是很久没摸索过c语言了,实在吃力,不得不放弃了。

最后温馨提醒:以上所有代码都需要"wrapper.h"这个头文件,如果需要进行代码复用,亲手尝试代码运行结果的同学,可以私信我转发。这个头文件只是个针对课程学习内容的万能头文件,有能力的同学可以自己按需添加头文件也可,不一定需要wrapper.h

如果需要wrapper.h,可以私信我转发,但效率一般不高,如果有积分的同学可以到wrapper.h头文件CSDN下载地址https://download.csdn.net/download/enjoy_code_/12521655
自行下载,我虽然设置成了0积分,但还是被系统管理员改成了1积分,请见谅。跪谢理解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux I/O编程 实验内容 的相关文章

  • 掌握 Linux 调试技术

    http www ibm com developerworks cn linux sdk l debug index html ibm pcon 在 Linux 上找出并解决程序错误的主要方法 Steve Best sbest us ibm
  • Linux文件编程常用函数详解——wait()函数

    函数原型和头文件 include
  • Linux文件编程常用函数详解——fcntl()函数

    fcntl 函数 include
  • Linux下gdb编译调试程序

    Linux下gdb编译调试程序 前言 一 调试前的准备 二 gdb中断点的使用 三 gdb中运行调试程序 四 gdb中打印值和监控值 总结 参考 前言 本文记录调试工具gdb的一些基础使用方式 gdb是一个程序调试工具 注意 如果是程序语法
  • setlocale()用法笔记

    http www cnblogs com hnrainll archive 2011 05 07 2039700 html C 和 C 的标准库分别有自己的 locale 操作方法 C 标准库的 locale 设定函数是 setlocale
  • Linux中修改MAC地址和IP地址的命令(netset、ip、ifconfig)

    修改MAC地址 ip link set eth0 address aa aa aa aa aa aa 解析 eth0是网卡的名字 可以用ifconfig命令查看 aa aa aa aa aa aa是想要修改后的MAC地址 修改IP地址 1
  • linux stat函数讲解

    原文地址 http www cnblogs com hnrainll archive 2011 05 11 2043361 html 表头文件 include
  • 详解linux下的串口通讯开发

    串行口是计算机一种常用的接口 具有连接线少 通讯简单 得到广泛的使用 常用的串口是RS 232 C接口 又称EIA RS 232 C 它是在1970年由美国电子工业协会 EIA 联合贝尔系统 调制解调器厂家及计算机终端生产厂家共同制定的用于
  • PF_NETLINK应用实例NETLINK_KOBJECT_UEVENT具体实现--udev实现原理

    相对于linux来说 udev还是一个新事物 然而 尽管它03年才出现 尽管它很低调 J 但它无疑已经成为linux下不可或缺的组件了 udev是什么 它是如何实现的 最近研究Linux设备管理时 花了一些时间去研究udev的实现 udev
  • linux glob函数man页与实例

    Linux Programmer s Manual NAME glob globfree find pathnames matching a pattern free memory from glob SYNOPSIS include
  • Linux多进程:orphan process——孤儿进程

    孤儿进程orphan process 当父进程比子进程先结束 这样的子进程就成为了孤儿进程 每当出现一个孤儿进程 内核会把孤儿进程的父进程设置为init 托管 init进程会循环wait 孤儿进程结束 然后做剩下的善后 回收资源 因此 孤儿
  • Linux进程编程常用函数详解——vfork()和exec()函数

    vfork 函数原型
  • Linux system函数返回值

    http blog cheyo net p 42 例 1 status system test sh 1 先统一两个说法 1 system返回值 指调用system函数后的返回值 比如上例中status为system返回值 2 shell返
  • 生产者与消费者模式(线程的同步与互斥)

    条件变量 条件变量的提出首先要涉及一个概念 就是生产者消费者模型 生产者消费者 是在多线程同步的一个问题 两个固定大小缓冲区的线程 在实际运行是会发生问题 生产者是生成数据放入缓冲区 重复过程 消费者在缓冲区取走数据 生产者消费者的模型提出
  • Linux I/O编程 实验内容

    一 实验目的 练习用UNIX I O进行文件读写的编程方法 用UNIX I O函数管理文本信息 二进制数据 结构体数据 掌握UNIX I O的基本编程方法 练习测时函数使用 通过测量UNIX I O函数运行时间 建立UNIX I O API
  • 学习GDB

    http blog csdn net blueboy82006 article details 5586109 学习使用 GNU GDB Debugger 作者 王聪 GDB 常用命令参考手册 GDB 命令行参数 GDB 命令 GDB 操作
  • slect( )、poll( )、epoll( )函数详解

    1 slect 函数 1 1 函数原型 include
  • popen 使用方法

    popen 可以执行shell命令 并读取此命令的返回值 popen 函数通过创建一个管道 调用fork 产生一个子进程 执行一个shell以运行命令来开启一个进程 可以通过这个管道执行标准输入输出操作 这个管道必须由pclose 函数关闭
  • 如何快速确定程序的入口

    前言 在阅读代码时 知道程序的入口十分重要 这有助于快速理清程序的逻辑框架 我们找到程序入口后 顺着代码的执行顺序来阅读代码 可以比较容易的理解代码 这里说的代码是编译后成为可执行程序的代码 在linux中就是elf格式 被编译成可执行程序
  • gcc搜索动态链接库的路径优先级排序

    GCC运行时 Linux动态链接库的搜索路径按优先级排序为 1 编译目标代码时 Wl rpath 指定的动态库搜索路径 当指定多个动态库搜索路径时 路径之间用冒号 分隔 2 环境变量 LD LIBRARY PATH 指定的动态库搜索路径 3

随机推荐

  • LeetCode-1775. 通过最少操作次数使数组的和相等【贪心,数组,计数】

    LeetCode 1775 通过最少操作次数使数组的和相等 贪心 数组 计数 题目描述 解题思路一 让sum1
  • kubernetes pv回收策略

    本文最近更新于2021 9 11 kubernetes pv回收策略 当用户不再使用其存储卷时 他们可以从 API 中将 PVC 对象删除 从而允许该资源被回收再利用 PersistentVolume 对象的回收策略告诉集群 当其被从申领中
  • 冈萨雷斯《数字图像处理》学习总结及感悟:第一章 绪论 百闻不如一见

    前往老猿Python博文目录 https blog csdn net LaoYuanPython 一 引言 好几月前开始自学OpenCV Python 但老猿以前没接触过图像基础知识 数学知识基本上也都忘光了 因此在自学OpenCV Pyt
  • Python处理txt数据实例

    现在有一个具体的案例是这样的 CST电磁仿真软件得到一些txt数据在origin data文件夹中 需要其中的一些数据来通过origin软件绘制曲线分析一些问题 而且需要里面的所有数据曲线显示在同一个图形中 如果通过手动将txt数据一一复制
  • LeetCode第55题解析

    给定一个非负整数数组 你最初位于数组的第一个位置 数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个位置 示例 1 输入 2 3 1 1 4 输出 true 解释 我们可以先跳 1 步 从位置 0 到达 位置 1
  • js的闭包的理解

    js的变量的作用域分为全局变量和局部变量 函数内部的变量称为局部变量 在函数的内部可以访问到全局变量 但是函数外部无法访问函数内部的变量 闭包可以解决无法访问函数内部的变量的问题 且可以隐藏这个变量 不被外部直接访问 闭包 函数内部的子函数
  • JavaScript 搜索引擎 lunr.js

    lunr js 实现了在网页上的搜索引擎 类似 Solr 示例代码 view source print 01 定义索引 02 var idx lunr function 03 this field title boost 10 04 thi
  • flask需求文件requirements.txt的创建和使用

    flask需求文件requirements txt的创建及使用 简介 flask项目中包含一个requirements txt 文件 用于记录所有依赖包及其精确的版本号用以新环境部署 创建 生成需求文件 在命令行输入 pip freeze
  • 服务器一直被攻击怎么办?

    有很多人问说 网站一直被攻击 什么被挂马 什么被黑 每天一早打开网站 总是会出现各种各样的问题 这着实让站长们揪心 从修改服务器管理账号开始 到修改远程端口 什么措施都做了 还是会被攻击挂马 服务器一直被攻击时 要怎么做 1 切断网络 对服
  • 秋招-算法-动态规划篇

    秋招 算法 动态规划篇 只求秋招笔试能过 所以本文更多是怎么使用模板来解动态规划题 能过就好 对时间和空间的考虑不会太多 介绍 动态规划通过组合子问题的解得到原问题的解 适合动态规划解决的问题具有重叠子问题和最优子结构两大特征 通常使用空间
  • caffe 学习率设置问题

    solver算是caffe的核心的核心 它协调着整个模型的运作 caffe程序运行必带的一个参数就是solver配置文件 运行代码一般为 caffe train solver slover prototxt 在Deep Learning中
  • Unity和VS2019下载及配置流程

    https www jianshu com p 6fe2dc4de4c3
  • 可编程手机蓝牙App控制直流电机速度

    我们将通过 Android 应用程序 app 介绍直流电机速度控制 对于该项目 该应用程序安装在智能手机设备中 该设备使用蓝牙向控制直流电机速度的电路发送命令 此 Android 应用程序具有引人注目且易于使用的图形用户界面 GUI 我们将
  • IBM区块链负责人Jesse Lund的“你问我答”

    点击上方 蓝色字 可关注我们 编辑 铅笔盒 IBM区块链部门负责人Jesse Lund抽空参与了 你问我答 活动 Ask Me Anything AMA 回答了关于加密货币及IBM与Stellar合作关系的一些问题 具体内容如下 IBM现在
  • ue4 DerivedDataCache报错

    启动ue4时报错 报错堆栈如下 从堆栈可以看出是DerivedDataCache报错 从堆栈的CachedDataProbablyExists函数更可以看出是在判断cache是否存在 故而想到删除项目目录下DerivedDataCache中
  • RPC框架的异步处理

    RPC异步调用 以tars rpc框架为示例说明 引入工作线程池和io收发线程池将工作线程和io收发线程两者的同步关系解除 RPC中的上下文十分重要 因为请求包的发送 响应包的callback回调不在同一个工作线程中完成 需要一个conte
  • 计算机组长原理,期末项目考核-计算机组成原理-组长学号-组长姓名

    2012 2013 第一学期第一学期 计算机组成原理计算机组成原理 期末考核期末考核 职位姓名学号在项目中担任的工作成绩 组长 组员 组员 组员 一 项目一 项目 1 描述 描述 设 CPU 共有 16 根地址线 8 根数据线 R W 作读
  • 山洪灾害预警方案(山洪预警解决方案的组成)

    随着气候变化的不断加剧 山洪灾害在许多地区成为了极具威胁性的自然灾害之一 为了帮助地方政府和居民更好地预防和应对山洪灾害 我们设计了一套基于星创易联的SR600工业路由器和DTU200的山洪灾害预警方案 并成功在某地区进行了部署 案例背景
  • Transaction rolled back because it has been marked as rollback-only 解决办法

    今天早上高高兴兴上班 居然收到一大堆报警信息 仔细看了一下具体内容 都在提示这个错误 Transaction rolled back because it has been marked as rollback only 我一看就觉得奇怪了
  • Linux I/O编程 实验内容

    一 实验目的 练习用UNIX I O进行文件读写的编程方法 用UNIX I O函数管理文本信息 二进制数据 结构体数据 掌握UNIX I O的基本编程方法 练习测时函数使用 通过测量UNIX I O函数运行时间 建立UNIX I O API