C++ C+中的ifstream对象数组+;
我试图创建一个C++ C+中的ifstream对象数组+;,c++,arrays,iostream,ifstream,ofstream,C++,Arrays,Iostream,Ifstream,Ofstream,我试图创建一个ifstream对象数组,代码进行编译,我能够创建ifstream大小sizeargs-1的对象数组,但是一旦我试图在其中一个ifstream对象中打开文件,程序就会崩溃,这非常令人沮丧 我尝试这样做的原因是,我必须根据内存中.ppm文件的数量动态创建ifstream对象,这似乎是一个完美的解决方案,只要能够ifstream\u数组[1]。打开(args[0])因为我需要同时从多个.ppm文件中读取文本 如果这样做是不可能的;有没有别的办法 int main(int argc, c
ifstream
对象数组,代码进行编译,我能够创建ifstream
大小sizeargs-1
的对象数组,但是一旦我试图在其中一个ifstream
对象中打开文件,程序就会崩溃,这非常令人沮丧
我尝试这样做的原因是,我必须根据内存中.ppm
文件的数量动态创建ifstream
对象,这似乎是一个完美的解决方案,只要能够ifstream\u数组[1]。打开(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]);
}
不,没有。计算结果为sizeof(char**)/sizeof(char*)
,它始终为1<因此,code>sizeargs-1为0
,您的数组中没有项目。通过指向数组的指针无法找到数组的大小。您需要使用argc
,它是args
中的元素数
基于注释,还应该避免可变长度数组,因为它们只适用于编译器扩展,而不是C++标准的一部分。我建议改为使用向量:
std::vector<std::ifstream> inputfiles(sizeargs-1);
std::矢量输入文件(sizeargs-1);
不,没有。计算结果为sizeof(char**)/sizeof(char*)
,它始终为1<因此,code>sizeargs-1为0
,您的数组中没有项目。通过指向数组的指针无法找到数组的大小。您需要使用argc
,它是args
中的元素数
基于注释,还应该避免可变长度数组,因为它们只适用于编译器扩展,而不是C++标准的一部分。我建议改为使用向量:
std::vector<std::ifstream> inputfiles(sizeargs-1);
std::矢量输入文件(sizeargs-1);
此声明:
int sizeargs = (sizeof(args)/sizeof(*args)); //counts number of .ppm files in array
ifstream inputfiles[sizeargs-1];
在*现代编译器上总是会产生sizeargs
=1,因为基本数据指针的大小除以基本数据指针的大小,等于1
在C++11及更早版本中,此语句:
int sizeargs = (sizeof(args)/sizeof(*args)); //counts number of .ppm files in array
ifstream inputfiles[sizeargs-1];
无效,因为(未动态分配)原始数组的大小必须是编译时常量
然而,g++提供了C99可变长度数组(VLA)作为语言扩展
相反,请使用
std::vector
*James Kanze在对另一个答案的评论中指出,有些机器的sizeof(char*)
大于sizeof(char**)
。由于char
是基本的可寻址单元,因此char*
指针是最大的普通指针。我认为这种区别在这里并不重要,但读了詹姆斯的评论(我们在过去讨论过这一点),我意识到我对SO答案“价值”的态度是错误的,并相应地进行了调整。这句话:
int sizeargs = (sizeof(args)/sizeof(*args)); //counts number of .ppm files in array
ifstream inputfiles[sizeargs-1];
在*现代编译器上总是会产生sizeargs
=1,因为基本数据指针的大小除以基本数据指针的大小,等于1
在C++11及更早版本中,此语句:
int sizeargs = (sizeof(args)/sizeof(*args)); //counts number of .ppm files in array
ifstream inputfiles[sizeargs-1];
无效,因为(未动态分配)原始数组的大小必须是编译时常量
然而,g++提供了C99可变长度数组(VLA)作为语言扩展
相反,请使用
std::vector
*James Kanze在对另一个答案的评论中指出,有些机器的
sizeof(char*)
大于sizeof(char**)
。由于char
是基本的可寻址单元,因此char*
指针是最大的普通指针。我认为这种区别在这里并不重要,但读了James的评论(我们在过去讨论过这一点),我意识到我对SO答案“价值”的态度是错误的,并相应地进行了调整。此外,ifstream inputfiles[sizeargs-1];这是无效的。数组的大小必须是常量。这不是标准的C++,只有编译器允许扩展时才会工作。C++是C++的。为什么不使用std::vector
,这样分配和调整大小就更容易了?它实际上不是一个数组,而是指向指针数组的指针。通常是1,但并不总是1。有(或曾经有)台机器上的char*
大于char**
(在这种情况下,它将是0)。谢谢,一位同学给了我那个代码(sizeof(args)/sizeof(*args));,我认为这是正确的,除了ifstream inputfiles[sizeargs-1]之外,我知道还有一个问题需要解决;这是无效的。数组的大小必须是常量。这不是标准的C++,只有编译器允许扩展时才会工作。C++是C++的。为什么不使用std::vector
,这样分配和调整大小就更容易了?它实际上不是一个数组,而是指向指针数组的指针。通常是1,但并不总是1。有(或曾经有)台机器上的char*
大于char**
(在这种情况下,它将是0)。谢谢,一位同学给了我那个代码(sizeof(args)/sizeof(*args));,我认为这是正确的,我知道有一个问题需要解决