2017-2018-1 20155204 《信息安全系统设计基础》第四周课堂实践总结
补充课上没有完成的内容
- 内容:用Linux IO相关系统调用编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能,注意XXX是文件名,通过命令行传入,不要让用户输入文件名
- 实现:
(1) 首先利用man
命令学习一下我们要调用的函数open
read
(2) 编写代码实现:
参考别出心裁的Linux系统调用学习法学习视频,掌握两个重要命令
- man -k key1 | grep key2| grep 2 : 根据关键字检索系统调用
- grep -nr XXX /usr/include 查找宏定义,类型定义
完成head,tail的使用,相关API的分析,伪代码,产品代码,测试代码的编写
1.head
(1)分析:输出文件前*行的内容。
(2)伪代码:
int main(传入文件信息){
打开文件
输出文件长度转为数字
for(循环到文件尾){
do{
输出文件内容
有换行则跳出
}while(文件结束)
}
关闭文件
}
(3)产品代码:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char*argv[])
{
FILE *fp=fopen(argv[2],"r");
int i,j;
char ch;
j=atoi(argv[1]);
for(i=0;i<j;i++)
{
do{ ch=fgetc(fp);
putchar(ch);
if(ch == '
') break;
}while(ch!=EOF);
}
fclose(fp);
}
(4)测试:
2.tail
(1)分析:输出文件后*行
(2)伪代码:
int main(文件信息){
打开文件
i=line(文件)
再次打开文件
while(文件结束){
if(有空格) 计数;
if(到了开始输出的行){
while(文件结束){
输出文件内容
}
}
}
}
int line(文件){
while(文件结束){
计数文件行数
}
关闭文件
放回文件行数
}
(3)产品代码:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int line(FILE *fp);
void main(int argc,char *argv[]){
char ch;
int i,j=0,m;
FILE *fp=fopen(argv[2],"r");
i=line(fp);
fp=fopen(argv[2],"r");
m=atoi(argv[1]);
while(ch!=EOF){
ch=fgetc(fp);
if(ch=='
') j++;
if(j==i-m){
while(ch!=EOF){
ch=fgetc(fp);
putchar(ch);
}
}
}
fclose(fp);
}
int line(FILE *fp){
char ch;
int i=0;
while(ch!=EOF){
ch=fgetc(fp);
if(ch=='
') i++;
}
fclose(fp);
return i;
}
(4)测试
问题总结
问题1:myod输出时最后会跟一个换行符
解决1:在判断结束时多加了一个是否到换行符,消除了换行符的输出
问题2:tail无法输出
解决2:因为在输出文件前有一个统计行数的函数 line ,这个函数中文件已经读到了末尾,所以需要在这个函数中关闭文件,再回到主函数打开一次,这样就能从头读文件。