如何在C++中返回文件名?

3

我有问题

如何在程序中使用代码获取“input.txt”文件的名称?

./a.out < input.txt

文件名不在主函数参数中。

4
据我所知,你不能这样做,至少在标准的C++中不行。 - NathanOliver
2
您正在使用管道将input.txt的主体传输到标准输入。对于您的程序而言,这只是标准输入,没有其他作用! - Kerek
1
感谢大家的回答。 - Risoko
echo "There may not even be a file to get the name of" | ./aout - Eljay
2个回答

2
根据可执行文件名为a.out,这是在类Unix操作系统下进行的。假设它是Linux,在进程运行时,会在/proc/self/fd/0下创建指向输入文件(在您的情况下为input.txt)的符号链接。您可以使用readlink获取其内容。
char LinkTarget[200];
readlink("/proc/self/fd/0", LinkTarget, sizeof LinkTarget);

如果您需要文件的名称而不仅仅是内容,那么最好让您的程序通过命令行参数(内部使用argv)接受文件名,就像Eddymage所建议的那样。


1
一般情况下是做不到的。重定向“匿名化”了文件名。命令行解释器(但这可能是任何类型的环境)通常会打开文件并将打开的文件描述符“传输”给命令进程。因此,该进程只知道描述符而不知道如何获取它。
根据托管操作系统的不同,可能可以检索文件名,但不能保证。例如,在Unix或其派生版本上,您可以通过对描述符0调用fstat并在文件系统中搜索(inode,idev)来检索它,但即使在这种情况下,文件名也可能已经消失!在Unix上有一些技巧支持/proc,但同样可能会出现文件名消失的情况!在Unix上,重定向可能不来自文件(请参见shell的“here document”运算符)。更常见的是从匿名管道输入。因此,如果使用了重定向,则要检索“原始”文件要么天性不可能,要么非常困难(如果可能)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接