C++技术问询:如何读取指定目录下所有.txt文件?
用通配符批量读取*.txt文件的实现方法
嗨,这个问题问得很实际!先直接给你明确结论:标准C++的ifstream并不支持直接通过*.txt这种通配符来批量打开文件,你尝试的ifstream myFile ("*.txt")写法是无效的——ifstream的构造函数只认具体的单个文件名,没办法自动解析通配符匹配多个文件。
不过要实现批量读取所有.txt文件,还是有很多靠谱办法的,下面分不同场景给你讲清楚:
1. C++17及以上标准库(跨平台首选)
C++17引入了<filesystem>库,专门用来处理文件系统操作,完美支持通配符匹配逻辑,代码简洁还能跨Windows/Linux/macOS平台。示例代码如下:
#include <iostream> #include <fstream> #include <filesystem> namespace fs = std::filesystem; int main() { // 遍历C:\目录下所有文件,筛选出.txt后缀的 for (const auto& entry : fs::directory_iterator("C:\\")) { if (entry.path().extension() == ".txt") { std::ifstream file(entry.path()); if (file.is_open()) { std::string line; std::cout << "正在读取文件: " << entry.path() << std::endl; // 这里按行读取文件内容,你可以根据需求修改处理逻辑 while (std::getline(file, line)) { std::cout << line << std::endl; } file.close(); } else { std::cerr << "无法打开文件: " << entry.path() << std::endl; } } } return 0; }
如果需要更精准的匹配(比如只找foo*.txt这类文件名),还可以结合正则表达式进一步筛选。
2. Windows平台原生API
如果你的程序只针对Windows环境开发,可以用Win32的文件查找API:FindFirstFile和FindNextFile,直接调用系统接口实现通配符匹配:
#include <iostream> #include <fstream> #include <windows.h> int main() { WIN32_FIND_DATA findFileData; HANDLE hFind = FindFirstFile(L"C:\\*.txt", &findFileData); if (hFind == INVALID_HANDLE_VALUE) { std::cerr << "查找.txt文件失败!" << std::endl; return 1; } do { // 跳过目录,只处理实际文件 if (!(findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { std::wstring filePath = L"C:\\" + std::wstring(findFileData.cFileName); std::wifstream file(filePath); if (file.is_open()) { std::wstring line; std::wcout << L"正在读取文件: " << filePath << std::endl; while (std::getline(file, line)) { std::wcout << line << std::endl; } file.close(); } else { std::wcerr << L"无法打开文件: " << filePath << std::endl; } } } while (FindNextFile(hFind, &findFileData) != 0); FindClose(hFind); return 0; }
3. Linux/macOS平台原生API
在类Unix系统上,可以用POSIX标准的glob函数来解析通配符,快速获取匹配的文件列表:
#include <iostream> #include <fstream> #include <glob.h> int main() { glob_t globResult; // 注意:类Unix系统中访问Windows的C盘(比如WSL环境)路径是/mnt/c/,本地目录直接写"./*.txt"即可 int ret = glob("/mnt/c/*.txt", 0, nullptr, &globResult); if (ret != 0) { std::cerr << "查找.txt文件失败!" << std::endl; return 1; } for (size_t i = 0; i < globResult.gl_pathc; ++i) { std::ifstream file(globResult.gl_pathv[i]); if (file.is_open()) { std::string line; std::cout << "正在读取文件: " << globResult.gl_pathv[i] << std::endl; while (std::getline(file, line)) { std::cout << line << std::endl; } file.close(); } else { std::cerr << "无法打开文件: " << globResult.gl_pathv[i] << std::endl; } } globfree(&globResult); return 0; }
最后再划个重点
- 别再试
ifstream直接打开*.txt了,标准库根本不支持这种用法 - 优先选C++17的
<filesystem>,代码简洁还跨平台,现在主流编译器都支持 - 特定平台用原生API的话,性能可能略优,但代码没法通用
内容的提问来源于stack exchange,提问作者WWZX88
相关产品推荐
相关产品推荐

