2011-07-11 10 views
3
int main() 
{ 
    FILE *read_fp; 
    char buffer[BUFSIZ + 1]; 
    int chars_read; 

    memset(buffer, '\0', sizeof(buffer)); 
    read_fp = popen("cat popen*.c | wc -l", "r"); 
    if (read_fp != NULL) { 
     chars_read = fread(buffer, sizeof(char), BUFSIZ, read_fp); 
     while (chars_read > 0) { 
      buffer[chars_read - 1] = '\0'; 
      //buffer[chars_read] = '\0'; 
      printf("Reading:-\n %s\n", buffer); 
      chars_read = fread(buffer, sizeof(char), BUFSIZ, read_fp); 
     } 
     pclose(read_fp); 
     exit(EXIT_SUCCESS); 
    } 
    exit(EXIT_FAILURE); 
} 

FREAD(代碼)返回項目 數量成功讀取有一個錯誤在這裏使用的fread

我認爲有以下行應該從

buffer[chars_read - 1] = '\0'; 
改變

buffer[chars_read] = '\0'; 

我是否正確?

回答

3

您是否正在爲NULL終止字符串讀取?如果是這樣,那麼是的,buffer[chars_read] = '\0';將是做到這一點的方式。

除此之外,你的循環結構可以更容易,如果你這樣做是爲

do (
    chars_read = fread(....); 
    if (chars_read > 0) { 
     buffer[chars_read] = '\0'; 
     printf(....); 
    } 
} while (chars_read > 0); 

或更傳統的理解

while ((chars_read = fread(....)) > 0) { 
     buffer[chars_read] = '\0'; 
     printf(....); 
} 
2

我相信該代碼旨在從wc -l輸出中刪除最後一個換行符,這就是爲什麼它要寫入換行符位於字符串末尾的原因。它仍然不是特別理智的代碼,因爲你必須有一個非常小的BUFSIZ或錯誤的wc在你的$PATH循環,如果它確實循環,那麼覆蓋新行應該只發生在最後一遍(等同和可測試,它應該檢查buffer[chars_read - 1] == '\n')。

+0

只是因爲'緩衝[chars_read - 1] ==' \ n''不能保證這是輸入的結尾...... –

+0

正確;這個代碼有很多*錯誤,真的。它根本不處理多行,並且會在中間緩衝區中錯過一行;這對'fgets()'來說真的是一份工作。 – geekosaur