編寫完代碼後發現編譯出錯(圖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