2011-11-01 58 views
0

我的代碼在某種程度上工作正常。雖然我有兩個問題。一,在將文件打印到標準輸出結束時,它給我一個分段錯誤。在c - wwwmc中實現'cat'? (我的代碼出了什麼問題)

二,我不能使用fputs打印出數據,因爲我馬上得到了分段錯誤。因此,爲了解決這個問題,我使用了可以很好地打印它的puts,但在每行將文本單行隔開以及最終導致seg錯誤後添加'\ n'。

#include <stdio.h> 
#include <string.h> 

void concat(char *arg){ 

    char string[256]; 
    FILE *fp = fopen(arg, "r"); 

    while(!feof(fp)){ 
     fgets(string, 256, fp); 
     //fputs(string, fp); 
     puts(string); 
    } 

    fclose(fp); 

} 

void stdincat(){ 

    char string[256]; 
    while(!feof(stdin)){ 
     fgets(string, 256, stdin); 
     fputs(string, stdout); 
    } 
} 

int main(int argc, char *argv[]){ 

    char argvalues[256][40]; 

    if(argv[1] == NULL) 
     stdincat(); 
    else if(argv[1] != NULL){ 
     int i; 

     for(i=1;i<=(argc);i++){ 
      concat(argv[i]); 
     } 
    } 

    return 0; 
} 

回答

1

您在concat註釋,以fputs的通話試圖寫入fp,你的閱讀只開了,所以一點也不奇怪,它不會/不起作用。

除此之外,你的閱讀循環:while(!feof(fp)) {(以及除從stdin代替fp類似)遵循一個熟悉的,普遍的反模式 - 像這樣的循環不會/不/無法正常工作。通常你想在同一手術成功讀取測試:

while(fgets(string, 256, stdin)) 
    fputs(string, stdout); 

編輯:我還想說,我寧願避免concatstdincat代碼的重複。我寧願通過FILE *從作爲參數傳遞給閱讀,因此,您會使用相同的代碼從stdin或其他任意文件讀取:

// Warning: untested code. 
// error checking omitted for readability. 
void catfile(FILE *file) { 
    char line[256]; 
    while (fgets(line, sizeof(line), file)) 
     puts(line); 
} 

int main(int argc, char **argv) { 
    int i; 
    if (argc == 1) 
     catfile(stdin); 
    else for (int i=1; i<argc; i++) { 
     FILE *infile = fopen(argv[i], "r"); 
     catfile(infile); 
     fclose(infile); 
    } 
    return 0; 
} 

最後,我想指出,如果你只是要複製整個文件,fgets可能是而不是是完成這項工作的最有效方式。 fread可能更合適。當你在使用它的時候,你也可以使用二進制模式讀寫。

+0

謝謝! fgets問題只是盲目編碼。我很尷尬,我沒有看到.. 現在一切正常。謝謝! – jonalmeida

0

你不能在你打開的只讀流上寫,你應該在函數concat中使用stdout作爲fputs

相關問題