В C, как я печатаю имя файла файла, который перенаправляется, как введено в оболочке

Комментарий +1 Luke об использовании работы лицензия MSDN дома. Я думаю, что это - лучший ответ для OP.

Также рассматривают

  • DreamSpark (для студентов): http://www.dreamspark.com
  • BizSpark (для стартапов, создающих "веб-приложения следующего поколения"): http://www.bizspark.com
  • Уполномочивает (для независимых поставщиков программного обеспечения, желающих сотрудничать с Microsoft): http://www.empowerforisv.com

(Примечание там является некоторым перекрытием между BizSpark и Уполномочивает... многих независимых поставщиков программного обеспечения, найдет их обоих полезными)

, И наконец... не пропускайте пробные версии и VHD's. Программное обеспечение Most Microsoft доступно для пробной версии (30-360 дней). Многие доступны через "Тест-драйв VHD"

6
задан Nullpoet 14 November 2009 в 13:35
поделиться

8 ответов

Вы не можете получить имя файла в точности как входное; оболочка будет обрабатывать все эти перенаправления, не сообщая вам об этом.

В случае прямого перенаправления вы можете получить путь к файлу, связанный со стандартным вводом, используя fstat , чтобы получить номер inode для него, затем обход файловой иерархии аналогично find / -inum , чтобы получить путь, который ему соответствует. (Таких путей к файлам может быть несколько из-за ссылок.)

Но в этом нет необходимости. Как говорили другие, если вам нужно знать имена файлов, вы должны использовать имена файлов в качестве аргументов.

10
ответ дан 8 December 2019 в 13:00
поделиться

Почему вы хотите это сделать? Вся ваша программа a.out передается из оболочки, является дескриптором открытого файла, stdin.

Пользователь также может сделать это:

cat inpfilename | ./a.out

, и теперь у вас нет абсолютно никакого имени файла для использования ( кроме /dev/stdin).

Если a.out должен работать с именами файлов, почему бы не использовать файл в качестве аргумента командной строки?

4
ответ дан 8 December 2019 в 13:00
поделиться

Об этом узнает только родительская оболочка. Программа a.out всегда будет видеть его как стандартный ввод.

2
ответ дан 8 December 2019 в 13:00
поделиться

Ваша операционная система будет предоставлять вашей программе ввод из этого файла. Это прозрачно для вашей программы, и поэтому вы не можете видеть имя файла. Фактически, при некоторых обстоятельствах вы будете получать ввод, который не исходит из файла, например этот:

ls | ./a.out

То, что вам нужно, очень зависит от системы. Вероятно, лучшее решение - передать имя файла в качестве параметра. Таким образом вы получите имя файла и сможете открыть его, чтобы прочитать содержимое.

1
ответ дан 8 December 2019 в 13:00
поделиться

Я не думаю, что это возможно, поскольку < просто считывает содержимое inpfilename в STDIN.

Если вы хотите, чтобы inpfilename было доступны для вашей программы, но вы также хотите иметь возможность принимать данные из STDIN, настроить вашу программу на прием аргумента имени файла и открыть его в ФАЙЛ. Если аргумент не указан, присвойте свой ФАЙЛ STDIN. Тогда ваша процедура чтения ввода использует такие функции, как fscanf, а не scanf, и ФАЙЛ, который вы передаете, является либо ссылкой на файл fopened, либо STDIN.

0
ответ дан 8 December 2019 в 13:00
поделиться

Добрый день,

Как указано в ответе выше, вы видите только дескриптор открытого файла stdin.

Если вы действительно хотите это сделать, вы можете указать, что первая строка входного файла должна быть именем самого файла.

HTH

0
ответ дан 8 December 2019 в 13:00
поделиться

fstat (0, sb) (0 - дескриптор файла стандартного ввода) предоставит вам подробную информацию о входном файле, размере, разрешениях (так называемый режим ]) и индексный дескриптор устройства, на котором он находится.

В любом случае вы не сможете указать его путь: поскольку inodes unix не имеют представления, какому пути они принадлежат, и технически (см. ln ) они могут принадлежать более чем к одному пути .

0
ответ дан 8 December 2019 в 13:00
поделиться

Как вы выразились, процесс, запускающий a.out, не имеет представления об имени файла, который обеспечивает его стандартный ввод.

Вызов должен быть:

$ ./a.out inputfilename

и проанализируйте argv в int main (int argc, char * argv []) {...}

или

$ ./a.out <<< "inputfilename"

и получите имя файла из stdin.

Затем в ac вы необходимо открыть этот файл, чтобы прочитать его содержимое.

0
ответ дан 8 December 2019 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: