Intereting Posts
Могу ли я использовать библиотеку pcap для получения пакетов ipv6? Mozilla использует C DLL с js-ctypes C-код для подсчета количества бит «1» в символе без знака Почему эта программа C печатает странные символы на выходе? scanf () пропустить переменную Ошибка с модулем ffi node.js Неисправность Ошибка: Ошибка динамической связи: ошибка Win32 193 Как найти длину массива char в c Невозможно получить более 50% макс. теоретические характеристики умножения матрицы «Использование знакового целочисленного операнда с двоичным побитовым оператором» – при использовании короткого замыкания без знака printf, wprintf,% s,% S,% ls, char * и wchar *: Ошибки, не объявленные предупреждением компилятора? Отладчик памяти с ptrace Что для (?;) означает? Как вызывать calloc () 25 байт точно использование прототипа функции в функции без указателя FindResource работает, LoadBitmap не работает, LoadImage с диска работает

В C как мне печатать имя файла, перенаправленного как вход в оболочку

$cc ac $./a.out < inpfilename 

Я хочу напечатать inpfilename на stdout. Как я могу это сделать ? Спасибо за помощь в продвижении…

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

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

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

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

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

 cat inpfilename | ./a.out 

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

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

Это будет знать только родительская shell. Программа, a.out всегда будет видеть это как stdin.

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

 ls | ./a.out 

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

Фактически, можно получить имя файла из procfs, поскольку / proc / * / fd содержит символическую ссылку на открытые файлы:

 char filename[bufsize]; int sz = readlink("/proc/self/fd/0", filename, bufsize-1); filename[sz] = 0; puts(filename); 

Как вы выразили, процесс, выполняющий a.out, не имеет понятия имени файла, который предоставляет свой «стандартный ввод».

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

 $ ./a.out inputfilename 

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

или же

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

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

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

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

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

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

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

G’day,

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

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

НТН