簡體   English   中英

帶有數據文件的命令行參數

[英]Command line arguments with datafiles

如果我想傳遞程序數據文件,我如何區分它們是數據文件的事實,而不僅僅是文件名的字符串。 基本上我想文件重定向,但使用命令行參數,所以我可以肯定輸入是正確的。

我一直在使用:

./theapp < datafile1 < datafile2 arg1 arg2 arg3 > outputfile

但我想知道它看起來像這樣:

./the app datafile1 datafile2 arg1 arg2 arg3 > outputfile

允許使用命令行參數。

將兩個文件組合成這樣的標准輸入有點困難。 更好的是:

cat datafile1 datafile2 | ./theapp arg1 arg2 arg3 >outputfile

使用bash (至少),第二個輸入重定向會覆蓋第一個,它不會增加它。 您可以使用以下兩個命令查看:

cat <realfile.txt </dev/null # no output.
cat </dev/null <realfile.txt # outputs realfile.txt.

使用重定向時,您的應用程序甚至不會看到 >outputfile (例如)。 它由shell進行評估,打開它並將其連接到您嘗試運行的進程的標准輸出。 您的所有程序通常會看到:

./theapp arg1 arg2 arg3

與標准輸入相同,它由shell處理。

上面第一個命令唯一可能的問題是它將兩個文件合並為一個流,這樣你的程序就不會知道第一個結束和第二個結束的開始(除非它能以某種方式從文件的內容中推斷出這個)。

如果你想處理多個文件並知道它們是哪個,那么做一些歷史悠久的傳統就是:

 ./theapp arg1 arg2 arg3 @datafile1 @datafile2 >outputfile

然后打開您的應用程序並處理文件本身。 這比讓shell執行更多工作。

從程序的角度來看,所有命令行參數都是字符串,您必須自己決定它們是否代表文件名。 在Unix上只有兩個字節不能出現在文件名中:0x00和0x2F( NUL/ )。 [我的意思是字節 除了HFS +之外,Unix文件系統完全沒有注意到字符編碼,當然,合理的人使用UTF-8。

Shell重定向根本不會出現在argv中。

但是有一個約定:將不以短划線開頭的argv每個元素(當然除了argv[0] )作為要處理的文件的名稱,按它們出現的順序處理。 你不必做任何不引用的操作; 只是將它們傳遞給fopen (或open )。 如果字符串"-"顯示為argv的元素,則在該點處理標准輸入直到耗盡,然后繼續循環遍歷argv 如果字符串"--"出現在argv ,則將該點之后的所有內容視為文件名,無論它是否以短划線開頭。 (包括隨后出現的"-""--" )。

根據您使用的語言,可能有一個方便的庫模塊甚至語言原語來處理這些東西。 例如,在Perl中,您只需編寫

for (<>) {
   ... do stuff with $_ ...
}

你得到我在“有一個會議......”段落中免費提到的所有內容。 (但你說C,所以,嗯,你必須自己完成大部分工作。我不知道普通C的參數處理庫值得在磁盤上占用空間。:-()

暫無
暫無

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

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