2017-2018-1 20155230 《信息安全系统设计基础》第四周课堂实验
补充完成课上没有完成的内容(2分)
在课上学习时对于调用命令行参数的使用并不熟悉,加上之前的MYOD实现我使用的是程序运行后输入文件区别较大所以没能按时改完代码。要调用命令行参数需要在main()
的括号中添加一个整形和字符形分别 表示命令行参数的个数和存储字符参数的指针数组即:int main(int argc,char *argv[])
在课下的代码补全中,输出的字符无法像Linux下od命令一样输出"\n"也无法正常输出其16进制格式,于是在代码中另加了if
判定使其能够正确输出,百度之后了解可使用printf("\\n")
输出"\n"。
学习教材附录A,第十章内容
O_RDONLY:只读
O_WRONLY:只写
O_RDWR:可读可写
参考别出心裁的Linux系统调用学习法,学习视频,掌握两个重要命令:
man -k key1 | grep key2| grep 2 : 根据关键字检索系统调用,key1指功能,key2指条件。例如man -k read | grep 2
表示搜索二进制的读取功能代码。
grep -nr XXX /usr/include :查找宏定义,类型定义,用于查看.h头文件。
完成head,tail的使用,相关API的分析,伪代码,产品代码,测试代码的编写(3分)
- head和tail分别用于查看文件内容的前或后几行。例如
head/tail -2 123.txt
表示查看123.txt文件的前/后两行。
int main()
{
打开文件;
将字符形的条件数字转为整形;
for(条件行数)
{
do
{
依次读取文件中的字符;
输出字符;
}while(读到回车或读完)
}
关闭文件
}
以下是head命令的产品代码,因为行数较短且运行结果是否有错能一眼看出,所以没有另外编写测试代码。
#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);
}while(ch!='\n'&&ch!=EOF);
}
fclose(fp);
}
int main()
{
循环读取回车符
将字符形的条件数字转为整形;
do{
依次读取字符,读到j=总回车符-条件后开始输出读取字符。
}while(读完)
}
在编写tail时因为不知道文件具体有多少行,所以需要对文件的行数做一个了解,所以第一次读取文件用于查找回车符个数。第二次打开文件针对找到的条件,输出后几行。
#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 len;
char ch;
len=atoi(argv[1]);
int m=0;
do{
ch=fgetc(fp);
if(ch=='\n')
m++;
}while(ch!=EOF);
fclose(fp);
int i=0;
FILE *fp2=fopen(argv[2],"r");
for(i;i<m;)
{
ch=fgetc(fp2);
if(i>=m-len)
{
putchar(ch);
}
if(ch=='\n')
i++;
}
fclose(fp2);
return 0;
}