簡體   English   中英

在C中實現“貓”-wwwmc? (我的代碼有什么問題)

[英]Implementing 'cat' in c - wwwmc? (What's wrong with my code)

我的代碼在某種程度上可以正常工作。 我有兩個問題。 第一,在將文件打印到標准輸出的末尾,這給了我一個分割錯誤。

第二,我不能使用fputs來打印數據,因為我立即遇到了分段錯誤。 因此,為了修復它,我使用puts將其打印得很好,但在每行之后添加了一個'\\ n',使文本以單行隔開,並在末尾使用seg fault。

#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;
}

您在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可能更合適。 在使用它的同時,您也可以使用二進制模式進行讀寫。

你不能寫,你只能讀打開流,你應該在函數CONCAT使用標准輸出為的fputs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM