簡體   English   中英

在C編程中輸入重定向?

[英]Input redirection in C programming?

我正在嘗試將名為data1的數據文件重定向到我的程序中,但是我一直遇到segmentation fault

當我嘗試./w data1 ,它將正確讀取它,但是當我嘗試./w < data1將彈出錯誤。

我必須使用第二種方式進行作業。

這是我的代碼的樣子:

int main(int argc, char *argv[])
{
 FILE *Q;
 Q = fopen(argv[1],"r");
}

argv[1]指向二進制文件的第一個參數(無名稱),因此在./w < data1情況下會丟失它。 您正在嘗試訪問“非法”內存,因此遇到了段錯誤。

標記<是bash功能,不會傳遞給C。

如果要使用這樣的重定向,只需從標准輸入讀取而不關心文件/ argv。 這意味着“獲取文件data1並將其傳遞給描述符輸入0,這是標准輸入”。

您可以使用scanfread(0, ...)來使用文件的內容。

使用./w < data1 ,則無需打開文件。 剛從stdin讀取。

您的第一個命令工作的原因是因為您正在為程序提供參數(在您的情況下,文件名),並且您的程序使用該參數來打開文件。

使用重定向時,您會將stdin和stdout(可通過諸如gets和printf之類的函數訪問)重定向到文件,因此您根本不必打開程序中的任何文件。

您發出的第二個命令將文件的內容重定向到程序的標准輸入。 這意味着兩件事,首先,您需要從stdin(scanf)讀取數據,並且argv [1]將是未定義的。

所以要回答你的問題,你試圖打開一個未定義的值,轉換為指針,這反過來會導致你的崩潰

當程序以重定向開始時,文件已經打開。 您可以從名為“stdin”的流中讀取它。 在這種情況下,您正在使用指向不存在的東西(argv [1]),這就是它失敗的原因。

許多C函數默認使用stdin,因此您不必指定要讀取的文件。

您應該像這樣初始化FILE*變量:

FILE *Q; 
if (argc >= 2) {
    // at least one argument given, try to open it as file
    Q = fopen(argv[1],"r");
    // let's add error checking while we're at it!
    if (!Q) {
        perror("fopen");
        return 1; // note: this only works if this code is in main function
    }
} else {
    Q = stdin;
}

現在Q是作為命令行參數給出的文件,或者是stdin (表示標准輸入)。

有時您想要不提供參數,並且使用stdin,有時您想要打開文件。 這是你想要做的,

int main(int argc, char *argv[])
{
    FILE *Q = stdin; //use stdin unless you provide a filename
    if( (argc>1 ) && strcmp(argv[1],"-") ) { //allow "-" as alias for stdin
        if( !(Q = fopen(argv[1],"r")) ) {
            printf("Error, cannot open %s\n",argv[1]);
            exit(1);
        }
    }
    //read from Q here
}

暫無
暫無

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

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