Комментарий +1 Luke об использовании работы лицензия MSDN дома. Я думаю, что это - лучший ответ для OP.
Также рассматривают
(Примечание там является некоторым перекрытием между BizSpark и Уполномочивает... многих независимых поставщиков программного обеспечения, найдет их обоих полезными)
, И наконец... не пропускайте пробные версии и VHD's. Программное обеспечение Most Microsoft доступно для пробной версии (30-360 дней). Многие доступны через "Тест-драйв VHD"
Вы не можете получить имя файла в точности как входное; оболочка будет обрабатывать все эти перенаправления, не сообщая вам об этом.
В случае прямого перенаправления
fstat
, чтобы получить номер inode для него, затем обход файловой иерархии аналогично find / -inum
, чтобы получить путь, который ему соответствует. (Таких путей к файлам может быть несколько из-за ссылок.)
Но в этом нет необходимости. Как говорили другие, если вам нужно знать имена файлов, вы должны использовать имена файлов в качестве аргументов.
Почему вы хотите это сделать? Вся ваша программа a.out
передается из оболочки, является дескриптором открытого файла, stdin.
Пользователь также может сделать это:
cat inpfilename | ./a.out
, и теперь у вас нет абсолютно никакого имени файла для использования ( кроме /dev/stdin).
Если a.out
должен работать с именами файлов, почему бы не использовать файл в качестве аргумента командной строки?
Об этом узнает только родительская оболочка. Программа a.out всегда будет видеть его как стандартный ввод.
Ваша операционная система будет предоставлять вашей программе ввод из этого файла. Это прозрачно для вашей программы, и поэтому вы не можете видеть имя файла. Фактически, при некоторых обстоятельствах вы будете получать ввод, который не исходит из файла, например этот:
ls | ./a.out
То, что вам нужно, очень зависит от системы. Вероятно, лучшее решение - передать имя файла в качестве параметра. Таким образом вы получите имя файла и сможете открыть его, чтобы прочитать содержимое.
Я не думаю, что это возможно, поскольку <
просто считывает содержимое inpfilename
в STDIN.
Если вы хотите, чтобы inpfilename было доступны для вашей программы, но вы также хотите иметь возможность принимать данные из STDIN, настроить вашу программу на прием аргумента имени файла и открыть его в ФАЙЛ. Если аргумент не указан, присвойте свой ФАЙЛ STDIN. Тогда ваша процедура чтения ввода использует такие функции, как fscanf, а не scanf, и ФАЙЛ, который вы передаете, является либо ссылкой на файл fopened, либо STDIN.
Добрый день,
Как указано в ответе выше, вы видите только дескриптор открытого файла stdin.
Если вы действительно хотите это сделать, вы можете указать, что первая строка входного файла должна быть именем самого файла.
HTH
fstat (0, sb)
(0 - дескриптор файла стандартного ввода) предоставит вам подробную информацию о входном файле, размере, разрешениях (так называемый режим ]) и индексный дескриптор устройства, на котором он находится.
В любом случае вы не сможете указать его путь: поскольку inodes unix не имеют представления, какому пути они принадлежат, и технически (см. ln
) они могут принадлежать более чем к одному пути .
Как вы выразились, процесс, запускающий a.out, не имеет представления об имени файла, который обеспечивает его стандартный ввод.
Вызов должен быть:
$ ./a.out inputfilename
и проанализируйте argv
в int main (int argc, char * argv []) {...}
или
$ ./a.out <<< "inputfilename"
и получите имя файла из stdin.
Затем в ac вы необходимо открыть
этот файл, чтобы прочитать его содержимое.