2013-04-20 49 views
0
char *file1charbuf=(char*)malloc(sizeof(char)); 
char *file2charbuf=(char*)malloc(sizeof(char)); 

直到EOF我讀焦炭引入*file1charbuf*file2charbuf,然後比較如何比較的char *數組。如果循環保持在堆棧使用C

... 
check=read(file1, file1charbuf, 1); 
check2=read(file2, file2charbuf, 1); 
if (*file1charbuf!=*file2charbuf){ 
     printf("differ: char %i, line %i\n",charpos,linepos); 
     exit(1); 
} 
.... 

比較工作正常,但我想保持指針堆棧,而不是在堆中。另外malloc是C lib函數。

char *file1charbuf[1]; //1 element array of char 
char *file2charbuf[1]; 

與比較不工作的權利

... 
if (file1charbuf[0]!=file2charbuf[0]){ 
     printf("differ: char %i, line %i\n",charpos,linepos); 
     exit(1); 
} 
... 

和第二個問題。如果找到exit(1),是否需要close(file1)

  • 我應該只使用sys調用,而不是lib函數。
+0

@ H2CO3:它有C++和C標籤,顯然它應該「爲兩者工作」? – 2013-04-20 11:17:10

+0

@MatsPetersson我很害怕。 (但是又一次:誰在Unix上用C++編譯器*編譯C代碼?*反正它是很難看的,即使它是必要的和/或正確的。) – 2013-04-20 11:18:13

+0

您應該使用close來關閉文件描述符。在使用後釋放資源的良好做法。在unix退出後,所有資源都將被回收,但對於任何不支持資源回收的操作系統(如Vxwokrs)都會成爲問題。 – user2181624 2013-04-20 11:27:40

回答

0

代碼比較2個文件並列出不同的行和字符。它並不逐行比較字符,而是跟蹤行號並將文件加載到4K字節的塊中。

#define BLOCKSIZE 4096 

char file1charbuf[BLOCKSIZE]; //4096 character buffer in stack 
char file2charbuf[BLOCKSIZE]; 
int linepos=1, charpos =1, i, b1, b2 ; 
int file1 = open("1.txt", O_RDONLY); 
int file2 = open("2.txt", O_RDONLY); 

do{ 
    b1=read(file1, file1charbuf, BLOCKSIZE); 
    b2=read(file2, file2charbuf, BLOCKSIZE); 
    for(i=0; i < b1 && i < b2; ++i){ 
     if (file1charbuf[i]!=file2charbuf[i]){ 
     printf("differ: char %i, line %i\n",charpos,linepos); 
     close(file1); 
     close(file2); 
     exit(1); 
     } 
     if (file1charbuf[i] == '\n'){ 
     ++linepos; 
     charpos=0; 
     } 
     ++charpos; 
    } 
}while( (b1 == BLOCKSIZE || (file1==STDIN && file1charbuf[b1-1] != 0x26)) 
     && (b2 == BLOCKSIZE || (file2==STDIN && file2charbuf[b2-1] != 0x26))); 

if (b1 != b2) 
    printf("One bigger than the other\n"); 
close(file1); 
close(file2); 

關於從標準輸入讀:從標準輸入

的read(),當你按回車鍵疏導。那時只有你輸入的字符可以被閱讀。這意味着b1將等於您輸入的字符。 do-while條件將失敗,因爲讀取未讀取它請求的所有4096字節,這將使它認爲這是因爲流已結束。在\ n之後繼續讀取,我們必須更改while條件,以便如果我們正在讀取的文件描述符是STDIN,則繼續讀取,除非我們讀取的最後一個字符是流結束字符,我認爲它是0x26。我希望^ D也會以與enter相同的方式解除read()的阻塞。

+0

如果 file1是「abc」 file2是「ab」 你的程序返回等於 – 2013-04-21 12:24:22

+0

確實需要放一個'if(b1!= b2)printf(「比另一個大一個\ n」);' – 2013-04-21 12:40:26

+0

,謝謝!最後一個問題。如果file1或file2等於0(STDIN),如果我按輸入它會\ n並停止,但爲什麼?如何在\ n之後繼續閱讀並直到閱讀^ D(unix流結束)? – 2013-04-21 13:34:44

5

有相當與你展示的代碼的幾個問題,恐怕:

  1. Don't cast the return value of malloc(), in C
  2. sizeof (char)在C中總是1,所以像這樣使用它是沒有意義的。
  3. 當您看起來指的是字符數組時,您正在聲明指向字符的指針數組。

    char *file1charbuf[1]; //1 element array of char 應該
    char file1charbuf[1]; /* 1-element array of char */或者,當然,只是
    char file1charbuf; /* 1-character buffer. */

  4. 你做read()用1個字節的緩衝區,這是飛馳的低效。

  5. 要比較多於1個字符的字符數組(不一定是字符串,即不必爲零),請使用memcmp()
  6. 在致電exit()之前,最好在所有打開的文件描述符上調用close()。在大多數操作系統中,流程的死亡將導致其所有資源被重新聲明,但最好明確地執行。如果文件I/O使用基於緩衝FILE*的調用,則不需要,因爲這些在所有環境中都會自動關閉exit()
+0

哦,所以你讓文件描述符泄漏?當你讓代碼審計人員尋找內存泄漏並給你一個困難的時候,你說什麼?因爲你讓文件描述符泄漏? *「它更乾淨,但沒有必要」*?你的老闆爲了讓所有人的工作更加努力都會說些什麼? *「你被開除了」*?是的...... – Sebivor 2013-04-20 11:48:26

+0

FWIW,我曾經與TI DSP一起工作過,C編譯器有一個'sizeof(char)== 2'。我認爲C要求最低限度,但我不認爲它說明sizeof(char)*必須是1. IIRC,它是一個基於C89的編譯器。 – jszakmeister 2013-04-20 11:54:28

+3

@jszakmeister該編譯器不是C編譯器。在C中,'sizeof(char)'是**總是**一個。 'CHAR_BIT'可能因系統而異,但'sizeof'運算符返回類型或表達式類型中'char'的數量。 'char'中有多少個'char'? – Sebivor 2013-04-20 11:57:26

0

char *file1charbuf[1];是指向char的一個指針的數組。如果您想要一個char的數組,請使用char file1charbuf[1]

0

這些定義不是指向char數組的指針,它們是char數組。

char file1charbuf[1]; //1 element array of char 
char file2charbuf[1]; 

使用分配在堆上的內存和分配在堆棧上的內存的字符串的比較語義沒有區別。

0
... 
char c1, c2; 
check=read(file1, &c1, 1); 
check2=read(file2, &c2, 1); 
if (c1!=c2) { 
...