aha*_*bos 4 c++ io file ifstream
我在目录中有一堆文本文件,每个文本文件名为"info1.txt","info2.txt"等等.如何打开ifstream对象数组中的所有文本文件,而不必硬编码我的所有文本文件名?我知道以下代码不起作用,但我认为它传达了我想要做的想法,如果它确实有效:
ifstream myFiles[5];
for(int i = 0; i < 5; i++){
myFiles[i].open("info" + i + ".txt");
}
Run Code Online (Sandbox Code Playgroud)
我知道解决方案可能很简单,但经过大量的研究,试验和错误,我仍然没有想到它.谢谢!
为了构建文件名,我使用std::ostringstream和operator<<.
如果你想使用一个容器类一样std::vector(例如,因为你不知道在编译时有多少大的阵列ifstream的必应),因为std::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() ) );
}
Run Code Online (Sandbox Code Playgroud)
用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) );
}
Run Code Online (Sandbox Code Playgroud)
unqiue_ptr效率更高shared_ptr,因为unique_ptr它只是一个可移动的指针,它不是引用计数(因此开销少于shared_ptr).所以,在C++ 11,你可能要喜欢unique_ptr当ifstream的不是外面共享vector容器.
问题是,我想,关于动态创建文件名的部分.
其中一个简单的解决方案是使用std::ostringstream它:
ifstream myFiles[5];
for(int i = 0; i < 5; i++){
ostringstream filename;
filename << "info" << i ".txt";
myFiles[i].open(filename.str());
}
Run Code Online (Sandbox Code Playgroud)
如果你的库是旧的,它接受std::string调用中的参数open然后使用
myFiles[i].open(filename.str().c_str());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9458 次 |
| 最近记录: |