運行已編譯的C程序與a.out file_name_here
和a.out < file_name_here
有什麼區別?如何在Linux上將文件讀入C程序?
我記得有關Linux管道的一些事情,但我不記得如何使a.out
文件接受使用<
符號的文件。
基本上,我問的是:如何在C代碼尋找一個C程序:
- file_name_here是一個文本文件的「hello world」爲內容
- 終端得到「一個。出< file_name_here」在命令行
- 終端顯示輸出: 「世界你好」
運行已編譯的C程序與a.out file_name_here
和a.out < file_name_here
有什麼區別?如何在Linux上將文件讀入C程序?
我記得有關Linux管道的一些事情,但我不記得如何使a.out
文件接受使用<
符號的文件。
基本上,我問的是:如何在C代碼尋找一個C程序:
a.out file_name_here
通 「file_name_here」 作爲參數。
a.out < file_name_here
由shell處理,並將「file_name_here」的內容呈現給其「stdin」上的程序。
剛剛意識到我遇到的問題。 <
符號表示外殼用C文件的內容替換C中的普通用戶輸入,因此所有正常調用(如fgets
和sscanf
)都可以對其進行操作。
請注意,當您鍵入a.out < filename
時,shell將處理I/O重定向。該程序使用來自指定文件而不是終端的標準輸入運行。當你輸入a.out filename
時,程序必須處理打開文件,讀取文件(最好也關閉文件)。這些例子都不使用管道。你可以編寫cat file1 file2 file3 | a.out
這將使用一個管道,並提供三個文件的內容作爲程序的標準輸入。
Unix系統上的很多程序都是過濾器。如果他們被給予文件名來處理,那些被讀取。如果他們沒有給出文件名,那麼他們會讀取標準輸入。這種程序的一個例子是grep
;其他示例包括cat
和sort
。
的一般的解決方案,在輪廓是:
extern void process_file(FILE *fp); // Where the real work is done
int main(int argc, char **argv)
{
int rc = EXIT_SUCCESS;
if (argc == 1)
process_file(stdin);
else
{
for (int i = 1; i < argc; i++)
{
FILE *fp = fopen(argv[i], "r");
if (fp == 0)
{
fprintf(stderr, "%s: failed to open file %s for reading\n",
argv[0], argv[i]);
rc = EXIT_FAILURE;
}
else
{
process_file(fp);
fclose(fp);
}
}
}
return rc;
}
這將處理任何命令行參數作爲要被讀取的文件,訴諸如果沒有文件被在命令行上指定讀取標準輸入。你可以在這個大綱中做一些額外的調整。您可以使用getopt()
(或如果您使用GNU時爲getopt_long()
)輕鬆添加選項處理,並且您可以根據需要將文件名-
作爲標準輸入。如果您認爲合適(例如有時不適用 - 例如,grep
不適用),則可以在未能打開文件時退出。您可以將文件名傳遞給process_file()
函數。您可以讓process_file()
函數報告成功失敗,並且跟蹤是否所有操作都成功,只有在所有操作都成功時才退出。
'a.out file_name'將file_name作爲參數傳遞給程序,但'a.out
@IskarJarak:'<'重定向而不是管道文件的內容。程序直接從文件中讀取;它沒有一個管道讀取。 –