【问题标题】:Infile Handle in C++ (ala __DATA__ in Perl)C++ 中的 Infile 句柄(Perl 中的 __DATA__ )
【发布时间】:2009-02-21 10:14:43
【问题描述】:

C++ 是否可以通过文件句柄访问 infile 数据?例如 Perl 中的典型习语是:

while (<DATA>) {
  chomp;
  # do sth with $_
}

__DATA__
Foo
Bar

在 C++ 中有什么方法可以做到这一点?

【问题讨论】:

    标签: c++ filehandle


    【解决方案1】:

    您的意思是在程序中包含文件?

    不,C++ 做不到。与 Perl 不同。有许多工具可以将二进制或文本文件打包为 C/C++ 源代码。它们最终只是作为一个全局数组。

    我一直觉得有用的一件事是能够将随机内存作为文件句柄打开,这与您似乎在询问的内容相似。在标准 C++ 中,这可以通过 istringstream 类来完成,它与 ifstream 具有相同的接口。

    但您问题的上下文可能暗示有更好的方法来完成您在 C/C++ 中的想法。需要更多信息。

    【讨论】:

    • 如果数据在静态(模块范围)字符串中,则可以使用字符串流来读取它。
    【解决方案2】:

    我不会说它是惯用的,因为我从未在任何 C++ 代码中见过它,但您可以使用 C++ 字符串流和 C 预处理器字符串粘贴来将多行字符串视为输入流:

    #include <sstream>
    #include <iostream>
    
    using namespace std;
    
    const string data = 
        "once upon a time, " \
        "a young lass called Goldilocks\n" \
        "went for a walk in the forest.\n";
    
    int main ()
    {
        istringstream in (data);
    
        for (string line; getline(in, line); ) 
            cout << line << endl;
    
        return 0;
    }
    

    【讨论】:

    • 我认为您应该将 getline 放在 while 条件本身中。即使 getline 在字符串末尾失败,您的循环当前也会打印 'line'。
    【解决方案3】:

    C++ 没有惯用的方法来做到这一点。请改用单独的数据文件。

    根据您的平台,您可能希望使用资源来实现类似的结果,但这超出了 C++ 的范围。特别是,要将资源存储在二进制文件中,您需要使用外部工具并在代码中读取这些资源,您需要调用平台 API。例如在 Windows 下,有 LoadResource 函数(和相关的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      相关资源
      最近更新 更多