我正在进行一些基本的文件操作,并且希望将传递给可执行C程序的文件的名称存储起来,并创建一个在原始文件名上添加了扩展名的新文件。例如,如果这是我在命令行上输入的内容:
a.out < some_file.txt
a.out
是可执行文件,有没有办法获取字符串some_file.txt
,所以我可以打开一个新文件并将其称为some_file.text.mod
或其他?
argv[0]
为您提供a.out
,在脚本编写中,您可以使用$1
来访问参数(但不能使用重定向中使用的文件名),但这些都不是很有用。< / p>
有什么想法吗?
答案 0 :(得分:2)
在某些平台上,可以使用特定于平台的构造。
e.g。在linux上你可以在/ proc / self / fd / 0上调用readlink()
其他形式的重定向不提供对文件名的访问,可能没有文件 - 数据可能通过管道提供。
对于您的情况,在输入通过stdin重定向的情况下,让用户决定输出文件名可能会更好
答案 1 :(得分:1)
有时(并且几乎总是在实践中)/proc/self/fd/0
可能是文件的符号链接。 (但是符号链接可能很糟糕,例如管道,这是特定于Linux的。)
因此,您可以在a.out
内拨打readlink(2)
系统调用/proc/self/fd/0
但这样做有点恶心。无论如何:
% ls -l /proc/self/fd/0 < ~/.zshrc
lr-x------ 1 basile basile 64 Nov 6 19:22 /proc/self/fd/0 -> /home/basile/.zshrc
% date | ls -l /proc/self/fd/0
lr-x------ 1 basile basile 64 Nov 6 19:23 /proc/self/fd/0 -> pipe:[599869]
同样,它是高度特定于Linux的,并且无法移植到其他Posix系统。