编写完代码后发现编译出错(图5)“Myod和main被重复定义”。
java
我想多是由于经过命令行输入的文件名是“myod.c”致使的,因此建立了“t1.txt”,运行后编译结果以下图:(图6)
git
这说明问题不在代码上,我开始从本身的编译命令上思考,恍悟本身误将命令行输入加到了编译环节里,正确作法是在运行可执行文件时输入文件名。(图7)
数组
for(k=0;k<i;k++) printf("%c ",record[k]);
while(read(fd,&record,1)!=0 && read(fd,&record,1)!=0 )
while(read(fd,&record[i],1)!=0 )
运行后发现出现了两个问题:1.第一列的数字每次加32而非加8;2.十六进制值与字符位置不对应。通过分析代码发现是在记录行数时出现了问题,将行数i自加的指令从打印ascii值的循环中移动到后面打印字符的循环中后,运行结果以下:(图10)
安全
此时解决了第一行行号的错误,可是经过对比myod和系统命令“od -tx1 -tc myod.c”能够发现,打印时位置不对应的缘由是在打印字符时换行符“\n”做为换行输出了。增长判断是否为换行符的代码学习
if(record[i*16+j]=='\n') { printf("\\n "); } else { printf(" %c ",record[i*16+j]); }
后运行结果以下:(图11)测试
经过对比00260行能够发现,须要对制表符“\t”作一样的处理。经过对比发现最后结尾处myod打印了多余的ascii值“00 00 00 00 00 ”(图12)
命令行
在循环控制条件中加了一条判断语句"i*16+j<n",最后结果正确,如图所示(图13)设计
for(j=0;j<16 && i*16+j<n;j++)
经过运行“head myod.c”和“tail myod.c”能够发现,head、tail的做用分别是显示一个文件的前十行和后十行(图14)。
3d
使用命令“man -k head | grep 1”、“man -k tail | grep 1”查看帮助文档以下:(图15)
code
伪代码以下:
命令行读入文件并存入数组 while(从前向后遍历数组时换行符个数少于10个) do { 打印一行的字符 换行符个数自加 }
产品代码以下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <sys/types.h> 5 #include <sys/stat.h> 6 #include <fcntl.h> 7 #define BUFFERSIZE 4096 8 void Myhead(char record[],int n) 9 { 10 int i=0,num=0,j; 11 for(i=0;i<n&& num<10;i++) 12 { 13 if(record[i]=='\n') 14 num++; 15 printf("%c",record[i]); 16 } 17 } 18 int main(int argc,char** argv) 19 { 20 //struct utmp current_record; 21 char record[BUFFERSIZE]; 22 int fd,m=0,j=0,k=0,i=0,flag=0; 23 int relen=sizeof(record); 24 if((fd = open(argv[1],O_RDONLY)) == -1) 25 { 26 perror( argv[1]); 27 exit(1); 28 } 29 while(read(fd,&record[i],1)!=0 ) 30 { 31 i++;//i表示读入的字符个数 32 } 33 //for(k=0;k<i;k++) printf("%c ",record[k]); 34 Myhead(record,i); 35 close(fd); 36 return 0; 37 }
运行截图以下:(图16)
伪代码以下:
命令行读入文件并存入数组 while(从后向前遍历数组时换行符个数少于10个) do { 用变量记录当前数组下标 换行符个数自加 } 用一个循环打印从变量对应的下标开始到文件结尾的全部字符
产品代码以下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <sys/types.h> 5 #include <sys/stat.h> 6 #include <fcntl.h> 7 #define BUFFERSIZE 4096 8 void Mytail(char record[],int n) 9 { 10 int i,num=0,j; 11 for(i=n-1;i>=0,num<10;i--) 12 { 13 if(record[i]=='\n') 14 num++; 15 } 16 for(j=i-1;j<n;j++) 17 { 18 printf("%c",record[j]); 19 } 20 } 21 int main(int argc,char** argv) 22 { 23 //struct utmp current_record; 24 char record[BUFFERSIZE]; 25 int fd,m=0,j=0,k=0,i=0,flag=0; 26 int relen=sizeof(record); 27 if((fd = open(argv[1],O_RDONLY)) == -1) 28 { 29 perror( argv[1]); 30 exit(1); 31 } 32 while(read(fd,&record[i],1)!=0 ) 33 { 34 i++;//i表示读入的字符个数 35 } 36 //for(k=0;k<i;k++) printf("%c ",record[k]); 37 Mytail(record,i); 38 close(fd); 39 return 0; 40 }
运行截图以下:(图17)
## 20155312