MyOD(选作,计入平时成绩)

Myod的制作

源代码

myod.c

#include "myod.h"
#include <stdio.h>
int main(int argc,char *argv[])
{ 
 // puts(argv[1]);
  FILE *FP;
  char ch;
  FP=fopen(argv[1],"r+");
  ch=fgetc(FP);
  printf("output the content:\n");
   while(ch!=EOF)
  {
     if(ch=='\n')
    	printf("\n");
     else
    	printf("%4c",ch);
    	ch=fgetc(FP);
  }
   fclose(FP);
  ascii(argv[1]);
  hex(argv[1]);
  return 0;
}

ascii.c

#include "myod.h"
#include <stdio.h>
int ascii(char *textname)
{
  FILE *fp;
  char c;
    fp=fopen(textname,"r+");
    c=fgetc(fp);
  printf("output the ascii:\n");

  while(c!=EOF)
  {
     if(c=='\n')
        printf("\n");
     else
        printf("%4d",c);
        c=fgetc(fp);
  }
  fclose(fp);
return 0;
}

hex.c

#include <stdio.h>
int hex(char *textname)
{
  FILE *fp;
  char c;
  printf("output the hex:\n");
  fp=fopen(textname,"r+");
  c=fgetc(fp);
  while(c!=EOF)
  {
    if(c=='\n')
    printf("\n");
    else
    printf("%4x",c);
    c=fgetc(fp);
   }
   fclose(fp);
   return 0;
}

makefile

MYOD:myod.o ascii.o hex.o
	gcc *.o -o MYOD
myod.o:myod.c
	gcc -c myod.c
ascii.o:ascii.c
	gcc -c ascii.c
hex.o:hex.c
	gcc -c hex.c
clean:
	rm *.o

运行截图

测试makefile

静态库

gcc -c ascii.c hex.c 
ar rcs libmyodlib.a ascii.o hex.o
gcc myod.c -L. -lmyodlib -o MYOD
MYOD "20191204lhp.txt" 

动态库

gcc ascii.c hex.c -fPIC -shared -o libmyodlib.so 
gcc myod.c -L. -lmyodlib -o MYOD
export LD_LIBRARY_PATH=.
MYOD "20191204lhp.txt" 

重点遇到的问题

问题1:在编写代码是,初始文件名是通过scanf()函数从输出入端输入的,在输入时总是出现输错的情况十分的不方便。
解决办法:在搜索后发现了argc和argv【】:
void main(int argc,char *argv[])
argv[]:表示的是一个指针数组,一共有argc个元素,其中存放的是指向每一个参数的指针。

argc:参数个数
使用argv传入参数时可以使用tab补全文件名,可以避免大部分的输入错误,并且十分快捷。

引用链接:https://www.cnblogs.com/bestluna/p/wx-moonlightile.html

问题2:在测试输出结果时发现
od -tx -tc filename
的输出结果与自己的输出结果不太相同
od -tx1 -tc filename
的输出结果才与自己一致。

解决办法:多次观察后发现,-tx的每四个数字与我编写的代码输出恰好顺序相反,结合机组的知识发现,Linux的存储是按照小端的方式存储,于是才出现了上图的结果。

posted @ 2021-09-26 19:10  20191204李浩鹏  阅读(52)  评论(0编辑  收藏  举报