С точки зрения вашей программы все аргументы командной строки являются строками, и вы должны решить, представляют ли они имена файлов или нет сами. Есть только два байта, которые не могут появиться в имени файла в Unix: 0x00 и 0x2F (NUL
и /
). [Я действительно имею в виду байтов . За исключением HFS +, файловые системы Unix совершенно не обращают внимания на кодировку символов, хотя разумные люди, конечно, используют UTF-8.]
Перенаправления оболочки вообще не отображаются в argv
.
Однако существует соглашение: обрабатывать каждый элемент argv
(за исключением, конечно, argv[0]
), который не начинается с тире, как имя файла для обработки в порядке их появления. Вы НЕ должны делать никаких операций удаления кавычек; просто передайте их fopen
(или open
) как есть. Если строка "-"
отображается как элемент argv
, обработайте стандартный ввод в этой точке до исчерпания, а затем продолжите цикл по argv
. И если строка "--"
появляется в argv
, обрабатывайте все после этой точки как имя файла, независимо от того, начинается ли оно с тире. (Включая последующие появления "-"
или "--"
).
Может существовать удобный библиотечный модуль или даже языковой примитив, чтобы справиться с этим для вас, в зависимости от того, какой язык вы используете. Например, в Perl вы просто пишете
for (<>) {
... do stuff with $_ ...
}
и вы получите все, что я сказал в параграфе "Есть соглашение ..." бесплатно. (Но вы сказали, что C, так что, вы должны сделать большую часть этого самостоятельно. Мне не известна библиотека обработки аргументов для простого C, которая стоит места, которое она занимает на диске. :-()