C++ 如何仅通过文件名关闭存储在全局vector中的指定ifstream
解决方案
现有实现的核心问题
- 目前的
openFile存在逻辑错误:创建的std::ifstream对象没有调用open方法关联传入的文件路径,直接移动进vector后is_open()永远返回false,无法正常打开文件 - 现有存储结构仅存储流对象,没有关联流对应的文件路径,无法通过入参的文件名匹配到对应流
具体修改方案
第一步:调整存储结构
将原来的std::vector<std::ifstream>修改为同时存储文件名和对应流的键值对,存储位置可以是全局变量也可以是FileReader的类成员变量:
std::vector<std::pair<std::string, std::ifstream>> streams;
第二步:修正openFile实现
bool FileReader::openFile(std::string fileName) { // 先打开目标文件 std::ifstream inFile(fileName); if (!inFile.is_open()) { std::cout << "File Not Found"; return false; } // 可选逻辑:判断文件是否已经打开,避免重复存储 for (const auto& item : streams) { if (item.first == fileName) { std::cout << "File Already Opened"; return true; } } // 把文件名和对应流存入vector streams.emplace_back(std::move(fileName), std::move(inFile)); std::cout << "File Found"; return true; }
第三步:实现closeFile逻辑
遍历存储结构匹配文件名,找到后关闭流并移除对应条目即可:
bool FileReader::closeFile(std::string fileName) { for (auto it = streams.begin(); it != streams.end(); ++it) { if (it->first == fileName) { if (it->second.is_open()) { it->second.close(); } streams.erase(it); return true; } } // 未找到对应打开的文件 std::cout << "File Not Opened"; return false; }
注意事项
- 如果需要支持相对路径和绝对路径识别为同一个文件,可以在存储文件名时统一转为绝对路径再存储和匹配
- 如果业务允许同一个文件被多次打开,可以移除openFile中的重复打开判断逻辑
内容的提问来源于stack exchange,提问作者BigMo
相关产品推荐
相关产品推荐

