如何创建一个ifstream对象的数组,以及如何使用编号的文本文件填充该数组
How do I create an array of ifstream objects and how can I populate that array with numbered text files?
我在目录中有一堆文本文件,每个文本文件命名为" info1.txt"," info2.txt"等。我如何在不需要硬编码所有文本文件名中的ifstream对象中打开所有文本文件?我知道以下代码不起作用,但我认为它可以传达我想做什么的想法:
ifstream myFiles[5];
for(int i = 0; i < 5; i++){
myFiles[i].open("info" + i + ".txt");
}
我知道该解决方案可能非常简单,但是经过大量的研究,反复试验,我仍然没有弄清楚它。谢谢!
用于构建文件名,我将使用std::ostringstream
和operator<<
。
如果要使用std::vector
之类的容器类(例如,因为您不知道ifstream
的数组是多少)您不能使用vector<ifstream>
,但是可以使用vector<shared_ptr<ifstream>>
或vector<unique_ptr<ifstream>>
;例如:
vector<shared_ptr<ifstream>> myFiles;
for (int i = 0; i < count; i++)
{
ostringstream filename;
filename << "info" << i << ".txt";
myFiles.push_back( make_shared<ifstream>( filename.str() ) );
}
使用unique_ptr
(和C 11移动语义):
vector<unique_ptr<ifstream>> myFiles;
for (int i = 0; i < count; i++)
{
ostringstream filename;
filename << "info" << i << ".txt";
unique_ptr<ifstream> file( new ifstream(filename.str()) );
myFiles.push_back( move(file) );
}
unqiue_ptr
比shared_ptr
更有效,因为unique_ptr
只是可移动指针,因此没有参考计数(因此,比shared_ptr
的开销要少)。因此,在C 11中,如果ifstream
'S在vector
容器之外没有共享。
unique_ptr
。问题是,我猜是动态创建文件名的部分。
简单的解决方案之一是使用std::ostringstream
进行操作:
ifstream myFiles[5];
for(int i = 0; i < 5; i++){
ostringstream filename;
filename << "info" << i ".txt";
myFiles[i].open(filename.str());
}
如果您的库是旧的,以便接受std::string
open
中的CC_18参数,然后使用
myFiles[i].open(filename.str().c_str());
您的想法应该与一个小的更改一起使用:
myFiles[i].open((std::string("info") + itoa(i) + ".txt").c_str());
// ^^^^^^^^^^^ ^^^^
还要注意,您不能使用std::vector
,因为ifstream
不是可复制的对象。因此,继续使用数组。
我通常使用std :: stringstream:
{
std::stringstream filename;
filename << "info" << i << ".txt" << std::ends;
myFiles[i].open(filename.str().c_str());
}
您可以拥有一系列的ifstream对象,但是如果您需要动态长度,则不能以这种方式执行std::vector<ifstream>
工作。
因此您需要指针。std::vector<ifstream*>
可以工作,但您可以使用shared_ptr,因此std::vector<shared_ptr<ifstream> >
将起作用。如果您有可用的unique_ptr
,则可以使用它代替shared_ptr
。
然后必须使用new
创建每个元素。
您还需要正确创建字符串,您可以使用boost::format
或ostringstream
甚至老式的sprintf
来做到这一点。
顺便说一句,我会搜索Boost的文件系统库,以查看它们是否具有更动态的ifstream
,可以在您的向量中愉快地进行,而无需共享_ptr的混乱
- 如何在动态数组上使用搜索函数
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 在 C++ 中的数组上使用阶乘函数
- 如果我在字符数组上使用 close() 会发生什么?
- "p"数组如何使用 std::normal_distribution 存储以下代码中的值C++?
- 如何在使用 make_unique<T[]>() 制作的模板类型数组上使用 std::fill?
- 如何将 std::find() 与 2d std: 数组一起使用?
- 创建整数的 2D 数组,该数组将使用两个函数用随机数填充矩阵.我做错了什么?
- 如何从文件中读取数字并在数组中使用它们?
- 是否可以在数组上使用const_cast来更改元素?
- 在缓冲区/数组中使用颜色结构
- 将 unique_ptr<std::vector> 与 c 样式数组结合使用
- 在结构数组上使用 c++ std::copy
- 数组中使用 int 中的位的不同元素数
- 如何修复将传输到 java 的 2d 数组代码使用 JNI
- 正在使用C 三元运算符中的字符串常数,一种无效的非效率数组的使用
- 在数组中使用C++中的哈希表复制数组中的元素
- 将 find_if() 与数组一起使用的代码段中出错
- C 将1D动态数组施放到2D数组以使用常规索引(例如ARR [i] [J])
- 如何在数组中使用结构化绑定作为ARG传递给某些函数