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的存储是按照小端的方式存储,于是才出现了上图的结果。