【问题标题】:C++: Retrieving filename from istreamC++:从 istream 中检索文件名
【发布时间】:2026-01-21 10:00:01
【问题描述】:

我有一个函数:

void read_file(istream &file);

在 main() 中,我会传入如下内容:

ifstream file;
file.open(argv[1]);
read_file(file);

现在,在 read_file 函数中,有没有办法获取传入的文件名? 例如,如果 argv[1] 是“data1.txt”,我们可以从 read_file 中提取该字符串吗?

提前致谢。

顺便说一句,我试过了:

cout << file << endl; // Doesn't work.
cout << &file << endl; // Same result.

他们打印一个地址。

【问题讨论】:

  • 它不需要存储名称来完成它的设计目的,所以我严重怀疑它。
  • 不,流不存储该信息。
  • 你为什么要这样做???

标签: c++ string ifstream istream


【解决方案1】:

文件流不提供任何检索文件名的方法(或相关的打开模式)。您可以使用pword()xalloc() 将其存储在流的缓存中。您还需要注册必要的回调来解决生命周期依赖关系。

【讨论】:

    【解决方案2】:

    您可以将文件名存储在 main() 内的类级别变量中,以便它可用于您的 read_file 函数中的输出:

    const char* inFile = "";       // input file
    
    int main(int argc, char* argv[])
    {
        // assign value from args to
        // class level variable 'inFile'
        inFile = argv[1];       
    }
    

    然后您可以在 read_file 函数中输出“inFile”:

    cout << inFile << endl;
    

    【讨论】:

      【解决方案3】:

      您要求的那种事情通常在操作系统级别完成。这往往不是可移植的,也不会成为标准库。

      例如,假设您使用以下方式打开文件

       "~/../something.txt"
      

      库应该作为文件名返回什么?

      如果你打开了一个符号链接呢?

      如果操作系统允许同一个文件在目录中使用多个文件名怎么办?

      操作系统可以填写的数量取决于系统本身。例如,如果你曾经在 VMS 系统上工作过,它的系统服务会做很多 Unix 和 Dos 系统做不到的填充。

      库设计者通过不包含这些功能来避免这些系统相关问题。

      【讨论】: