【问题标题】:array of ifstream objects in C++C++ 中的 ifstream 对象数组
【发布时间】:2014-06-01 19:07:49
【问题描述】:

我正在尝试创建一个 ifstream 对象数组,代码编译并且我能够创建大小为 sizeargs-1 的 ifstream 对象数组但是一旦我尝试在其中一个 @ 中打开一个文件987654324@对象程序崩溃,很郁闷。

我尝试这样做的原因是我必须根据内存中 .ppm 文件的数量动态创建 ifstream 对象,这似乎是一个完美的解决方案,因为我能够 ifstream_array[1].open(args[0]);需要同时从多个.ppm 文件中读取文本。

如果这样做是不可能的;有其他方法吗?

int main(int argc, char ** args)
{
        //counts number of .ppm files in array       
        int sizeargs = (sizeof(args)/sizeof(*args)); 

        ifstream inputfiles[sizeargs-1];

        int incounter = 0;

        //this is where the program crashes
        inputfiles[incounter].open(args[0]); 
}

【问题讨论】:

    标签: c++ arrays iostream ifstream ofstream


    【解决方案1】:
    int sizeargs = (sizeof(args)/sizeof(*args)); //counts number of .ppm files in array
    

    不,它没有。这将计算为 sizeof(char**) / sizeof(char*),它始终为 1。因此,sizeargs-1 为 0,并且您的数组中没有任何项目。您无法通过指向它的指针找到数组的大小。需要使用argc,即args中的元素个数。


    基于 cmets,您还应该避免使用可变长度数组,因为它们仅适用于编译器扩展,而不是 C++ 标准的一部分。我建议改用向量:

        std::vector<std::ifstream> inputfiles(sizeargs-1);
    

    【讨论】:

    • 另外ifstream inputfiles[sizeargs-1];无效。数组的大小必须是常数。这不是标准的 C++,只有在编译器允许扩展时才有效。
    • 您使用的是 C++。为什么不使用std::vector 更容易分配和调整大小?
    • 它不是真正的数组,而是指向指针数组的指针。
    • 通常为 1,并非总是如此。有(或曾经有)机器上的 char* 大于 char**(在这种情况下,它将为 0)。
    • 谢谢,一位同学给了我那个代码 (sizeof(args)/sizeof(*args));,我认为它是正确的,一个我知道要解决的问题
    【解决方案2】:

    此声明:

        int sizeargs = (sizeof(args)/sizeof(*args)); //counts number of .ppm files in array
    

    在*现代编译器上总是会产生sizeargs = 1,因为基本数据指针的大小除以基本数据指针的大小是1。


    在 C++11 及更早版本中,此语句:

        ifstream inputfiles[sizeargs-1];
    

    无效,因为(非动态分配的)原始数组的大小必须是编译时间常数。

    但是,g++ 提供 C99 可变长度数组 (VLA) 作为语言扩展。


    改为使用std::vector。

    * 正如 James Kanze 在对另一个答案的评论中指出的那样,有些机器的 sizeof(char*) 大于 sizeof(char**)。因为char是基本的可寻址单元,所以char*指针是最大的普通指针。我不认为这种区别在这里是相关的,但是阅读詹姆斯的评论(我们过去已经讨论过这个),我意识到我对 SO 答案的“价值”的态度是错误的,并相应地进行了调整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      相关资源
      最近更新 更多