2017-2018-1 20155204 《信息安全系统设计基础》第四周课堂实践总结

2017-2018-1 20155204 《信息安全系统设计基础》第四周课堂实践总结

补充课上没有完成的内容

  1. 内容:用Linux IO相关系统调用编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能,注意XXX是文件名,通过命令行传入,不要让用户输入文件名
  2. 实现:

(1) 首先利用man命令学习一下我们要调用的函数open read

(2) 编写代码实现:

参考别出心裁的Linux系统调用学习法学习视频,掌握两个重要命令

  1. man -k key1 | grep key2| grep 2 : 根据关键字检索系统调用
  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 == '\n') 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=='\n')	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=='\n')	i++; 
	}	
fclose(fp);
return i;
	
}

(4)测试

问题总结

问题1:myod输出时最后会跟一个换行符

解决1:在判断结束时多加了一个是否到换行符,消除了换行符的输出

问题2:tail无法输出

解决2:因为在输出文件前有一个统计行数的函数 line ,这个函数中文件已经读到了末尾,所以需要在这个函数中关闭文件,再回到主函数打开一次,这样就能从头读文件。

posted @ 2017-10-15 23:28  20155204王昊  阅读(209)  评论(2编辑  收藏  举报