[英]C++ How Do I Read All .txt Files in a Directory?
如何读取特定目录中的所有.txt文件? 假设在我的C:\\
我有一个foo.txt
和foo2.txt
。 有没有一种方法可以阅读这两者而不必做这样的事情?
string text;
string text2;
ifstream myFile ("foo.txt");
ifstream myFile2 ("foo2.txt");
while(myFile << text){
};
while(myFile2 << text2){
};
换句话说,是否可以放置通配符*.txt
来指示读取所有.txt
文件?
ifstream myFile ("*.txt");
通常,您可以通过在命令行上传递要读取的文件名来完成此操作。 使用类似Linux的外壳程序,将通过外壳程序扩展类似foo *.txt
之类的内容,因此foo
将在其argc
/ argv
接收相应文件的名称。 在Windows上,shell不会执行此操作,但是如果您使用的是vc ++,则可以链接setargv.obj
以使其自动完成。
完成此操作后,您将在argc
/ argv
接收文件名,然后从那里进行处理:
int main(int argc, char **argv) {
if (argc < 2) {
std::cerr << "Usage: process <filename> [filename...]\n";
return EXIT_FAILURE;
}
for (int i=1; i<argc; i++) {
std::ifstream infile(argv[i]);
// process file
}
}
由于我看到您正在使用Windows,因此这里是FindFirstFile
, FindNextFile
。 不需要Windows机器,因此我无法举个例子,但是这里有资源:
然后,您可以提取ifstream的文件名。
或者,您可以使用C ++ 17 目录迭代器 。 我根本没有玩过。
如何读取特定目录中的任何.txt文件?
C ++ 11(请参阅n3337 )和C ++ 14标准不了解目录 。 您可能拥有一个没有目录的系统(即使今天并不常见;但是早期的MS-DOS 1没有目录),并且您可以拥有许多不同的文件系统 。
您需要操作系统对目录的支持。 请记住,从理论上讲,C ++实现可以在没有任何操作系统的计算机上存在。
甚至文件流的概念(在C ++语言规范中)也不需要与操作系统文件相关(请参阅参考资料 )。 但是,在大多数C ++实现中,它实际上是相关的。
C ++ 17正在为文件系统添加标准头<filesystem>
。 但是,许多C ++实现尚不支持该功能。 请参考您的C ++实现和系统的文档。
实际上,您需要操作系统的支持来处理目录。 您可以使用诸如Boost , Qt , POCO之类的框架。 实际上,它们包装了与目录有关的特定于操作系统的服务或系统调用 。
目录的概念(在详细信息中)随操作系统和文件系统而异:Windows上的目录与Linux上的目录不同。 甚至工作目录的概念也略有不同。
在Linux和POSIX上,请参见opendir(3) , readdir(3) , realpath(3) , dirname(3) , nftw(3) , getcwd(3) , stat(2) , chdir(2) , chroot(2) , mkdir(2)等...来处理目录(另请参见path_resolution(7) )。 在Windows上,情况有所不同(请参阅GRC的答案 )。
换句话说,是否可以在.txt旁边放一个星号,并说读取所有.txt文件?
ifstream myFile ("*.txt");
可能没有, 这没有任何意义 。 您是否要遍历多个文件(那么您将不会处理单个 ifstream
)? 您是否梦想着某种魔术机制(实际上不存在)将所有以.txt
结尾的文件连接在一起? 以什么顺序? 如果某些其他进程同时在该目录中添加或删除文件,该怎么办? 如果目录不包含任何以.txt
结尾的文件,该怎么办? 包含成千上万个文件和TB级数据的目录又如何呢(您的硬件将需要数小时或数天才能读取全部内容!)?
在某些操作系统(尤其是Linux)上, *.txt
是有效的文件路径(当然,它闻起来很糟,通常没有人故意创建此类文件;但是原则上可以创建此类文件)。 在这种情况下,您会期望什么行为? 假设的工作目录同时包含*.txt
文件以及一些a.txt
和b.txt
怎么b.txt
? 顺便说一句,在Linux上,文件实际上是一个inode(7) ,并且同一文件可能具有多个文件路径(请参阅link(2) ...),甚至没有。
另请阅读有关遍历的信息 (在各种OS上的工作方式有所不同:在Unix系统上,它通常由shell完成。据我不完全了解,在Windows上,它可能是由类似crt0的启动例程完成的。
花几天或几周时间阅读《 操作系统:三篇简单的文章》,以更好地理解操作系统的作用。
ifstream
的构造函数仅接受一个文件。
另外,在问任何问题之前,请先参考Google,以避免出现多个问题
不可以,您不能将“ * .txt”传递给ifstream的构造函数,并且不能读取两个文件的内容。 同样,您不需要两个对象,使用同一对象可以一个接一个地读取两个文件的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.