复习c文件处理内容
编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
main与其他分开,制作静态库和动态库
编写Makefile
提交测试代码和运行结果截图,提交调试过程截图,要全屏,包含自己的学号信息
首先说一下简要的思路
按照娄老师所说的,我们要将整个代码分为三个部分去书写,第一部分是写头文件,第二部分是用来写实现myod读取以及关闭文件的功能,而第三部分是能够使其输出od的字符。
首先第一部分的头文件十分好写
head.h文件
#ifndef HEAD_H
#define HEAD_H
void od(char str[],int);
#endif
第二部分是对main函数的书写
也就是对读取与关闭文件函数的书写
所以一定要用到file函数
#include<stdio.h>
int main()
{
FILE *fp;
fp=fopen("test.txt","rx");
if(fp==NULL){
printf("Fail to open file\n");
return 0;
}
char ch, str[100];
int a,n;
a=0;
if((ch=fgetc(fp))!=EOF){
str[a]=ch;
a++;
}
str[a]='\0';
fclose(fp);
od(str,a);
}
接下来是第三部分代码的书写
第三部分代码相对而言是最难的。我们可以看出每行最多只能够输出16个字符,也就是每16一换行。
在编写第三部分代码的时候,我们要注意每行代码数量的上限。
#include"head.h"
#include<stdio.h>
void od(char str[100],int a)
{
int b=1,f=0,e=0;
int line=0;
printf("%06d ",line);
putchar(str[0]);
for(b=1;b<=a;b++){
if(b%16!=0&&str[b]!='\0'){
if(str[b]!='\n')
{
printf(" %2c",str[b]);
}
else{
printf(" \\n");
}
}
else{
printf("\n ");
for(f=e;f<b;f++){
printf(" %02x",str[f]);
}
printf("\n%06d",b+2);
e=b;
}
}
printf("\n");
}
实验中遇到的问题和解决方法
1.没有头文件造成的问题
第一次在编写代码时只有od.c与myod.c,并且在代码的开头都没有加head.h,di第一次修改的时候只是在od.c前加入了头文件,然后发现编译还是有问题,最后我在myod.c文件头前加入head.h就好了。
第二部分od的应用:
1 参考教材第十章内容
2 用Linux IO相关系统调用编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能,注意XXX是文件名,通过命令行传入,不要让用户输入文件名
-
不要把代码都写入main函数中
-
要分模块,不要把代码都写入一个.c中
5 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息
6 课上上传代码到码云
首先我们需要调用函数
open函数的原型为:
int open(const char *path, int oflags);
int open(const char *path, int oflags, mode_t mode);
read函数的原型为:
size_t read(int fildes, void *buf, size_t nbytes);
接下来是编译代码
教材第十章内容总结
非常重要的一章,虚拟存储机制是计算机实现多任务的一项重要技术。计算机正是通过时间片技术使得每个进程在执行时仿佛独占CPU,进而又通过虚拟存储机制使得每一个进程在执行时,仿佛独占内存。
在UNIX系统中有一个说法,一切皆文件。所有的I/O设备,如网络、磁盘都被模型化为文件,而所有的输入和输出都被当做对相应文件的读和写来执行。这种将设备映射为文件的方式,允许UNIX内核引出一个简单、低级的应用接口,称为UNIX I/O,这使得所有的输入和输出都能以一种统一且一致的方式来执行。
打开文件 打开文件操作完成以后才能对文件进行一些列的操作,打开完成过以后会返回一个文件描述符,它在后续对此文件的所有操作中标识这个文件,内核记录有关这个打开文件的所有信息。
改变当前的文件位置。
读写文件
关闭文件
应用完成了对文件的访问之后,就通知内核关闭这个文件,内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池中。进程终止,内核也会关闭所有打开的文件并释放他们的存储器资源。