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) 编写代码实现:
1071529-20171015231710965-2131404695.png

参考别出心裁的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)测试:
1071529-20171015231723949-1103119709.png

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)测试
1071529-20171015231919027-685692436.png

问题总结

问题1:myod输出时最后会跟一个换行符1071529-20171015232454199-145238986.png

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

问题2:tail无法输出
1071529-20171015232647668-819068394.png

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

转载于:https://www.cnblogs.com/20155204wh/p/7674917.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值