[英]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,這是標准輸入”。
您可以使用scanf
或read(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.