MyOD

课程:《信息安全系统设计与实现》
班级:1912
姓名:雷天荣
学号:20191219
教师:娄嘉鹏
必修/选修: 必修课

任务详情
1 复习c文件处理内容
2 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
3. main与其他分开,制作静态库和动态库
4. 编写Makefile
5 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息
6 在博客园发表一篇博客,重点写遇到的问题和解决过程

1.c文件处理内容

1. 打开文件
可以使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FILE 包含了所有用来控制流的必要的信息。

FILE *fopen( const char * filename, const char * mode );
以上函数中filename 是字符串,用来命名文件,访问模式 mode 的值可以是下列值中的一个:
| 模式 | 描述 |
| ---- | ---- | ---- |
| r | 打开一个已有的文本文件,允许读取文件。 |
| w | 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。 | |
| r+ | 打开一个文本文件,允许读写文件。 |
| a | 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。 | |
| w+ | 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。 | |
| a+ | 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。 | |

2.关闭文件
使用 fclose( ) 函数。
int fclose( FILE *fp );
如果成功关闭文件,fclose( ) 函数返回零,如果关闭文件时发生错误,函数返回 EOF。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。EOF 是一个定义在头文件 stdio.h 中的常量。

3.写入文件
字符写入函数:
int fputc( int c, FILE *fp );
函数 fputc() 把参数 c 的字符值写入到 fp 所指向的输出流中。如果写入成功,它会返回写入的字符,如果发生错误,则会返回 EOF

字符串写入函数:
int fputs( const char *s, FILE *fp );
函数 **fputs() **把字符串 s 写入到 fp 所指向的输出流中。如果写入成功,它会返回一个非负值,如果发生错误,则会返回 EOF

4.读取文件
从文件读取单个字符的最简单的函数:
int fgetc( FILE * fp );
fgetc()函数从 fp 所指向的输入文件中读取一个字符。返回值是读取的字符,如果发生错误则返回 EOF
从流中读取一个字符串函数:
char *fgets( char *buf, int n, FILE *fp );
函数 fgets()从 fp 所指向的输入流中读取 n - 1 个字符。

实操截图
1.代码

点击查看代码
   #include<stdio.h>
   #include<stdlib.h>
   
   int main(void)
   {
       FILE *fp;
       int ch;
       
       if((fp = fopen("hello.txt","r"))== NULL)
      {
      
          printf("Failed to open file!\n");
          exit(EXIT_FAILURE);
      }       
      
      while ((ch = getc(fp)) != EOF)
      {      
             putchar(ch);
      }
      
      fclose(fp);
      
      return 0;

编辑代码

2.创建并编辑文件

3.编译运行
gcc text.c &&./a.out

5.以数据块的形式读写文件
fread() 函数用来从指定文件中读取块数据。所谓块数据,也就是若干个字节的数据,可以是一个字符,可以是一个字符串,可以是多行数据,并没有什么限制。fread() 的原型为:
size_t fread ( void *ptr, size_t size, size_t count, FILE *fp );
fwrite() 函数用来向文件中写入块数据,它的原型为:
size_t fwrite ( void * ptr, size_t size, size_t count, FILE *fp );
对参数的说明:

  • ptr 为内存区块的指针,它可以是数组、变量、结构体等。fread() 中的 ptr 用来存放读取到的数据,fwrite() 中的 ptr 用来存放要写入的数据。
  • size:表示每个数据块的字节数。
  • count:表示要读写的数据块的块数。
  • fp:表示文件指针。
  • 理论上,每次读写 size*count 个字节的数据。
    size_t 是在 stdio.h 和 stdlib.h 头文件中使用 typedef 定义的数据类型,表示无符号整数,也即非负数,常用来表示数量。
    返回值:返回成功读写的块数,也即 count。如果返回值小于 count:
  • 对于 fwrite() 来说,肯定发生了写入错误,可以用 ferror() 函数检测。
  • 对于 fread() 来说,可能读到了文件末尾,可能发生了错误,可以用 ferror() 或 feof() 检测。

其他I/O库函数

  • fseek(), ftell()、 rewindO):更改文件流中的读/写字节位置。
  • feof(), ferr(), filen0():测试文件流状态。
  • fdopen():用文件描述符打开文件流。
  • freopen():以新名称重新打开现有的流。
  • setbuf(), setvbuf():设置缓冲方案。
  • popen():创建管道,复刻子进程来调用sh。

2.编写myod.c

1.head.h
void asc(char *p); void hex(char *p);

2.asc.c

#include "head.h"
#include<stdlib.h>
#include<stdio.h>
void asc(char *p)
{
FILE *fp;
char ch;
printf("asc mode:\n");
if((fp=fopen(p,"r"))==NULL)
{
printf("file open failed!!\n");
exit(0);
}
while(!feof(fp))
{
ch=fgetc(fp);
if(ch=='\n')
    printf("\n");
else
    printf("%4d",ch);
}
    }

3.hex.c

#include "head.h"
#include <stdio.h>
#include <stdlib.h>
void hex(char *p)
{
FILE *fp;
char ch;
printf("hex:\n");
if((fp=fopen(p,"r"))==NULL)
{
printf("file open failed!!\n");
exit(0);
}
while(!feof(fp))
{
ch=fgetc(fp);
if(ch!=EOF)
{
if(ch=='\n')
    printf("\n");

else
    printf("%4x",ch);
}
}
}

4.myod.c

#include "head.h"
#include <stdio.h>
void main()
{
char Text[50];
printf("Enter textname:");
scanf("%s",Text);
hex(Text);
printf("\n");
asc(Text);
}

3.静态库和动态库

1.静态库

2.动态库

4.makefile文件

posted @ 2021-09-26 21:54  1219雷天荣  阅读(37)  评论(0编辑  收藏  举报