如何读取某个目录中的所有.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");
答案 0 :(得分:3)
您通常通过传递要在命令行上读取的文件名来执行此操作。使用类似Linux的shell,传递foo *.txt
之类的内容将由shell进行扩展,因此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
}
}
答案 1 :(得分:3)
由于我发现您在这里使用的是FindFirstFile
,FindNextFile
。没有Windows机器,所以我不能给你举例,但这里有资源:
您可以提取ifstream的文件名。
或者您可以使用C ++ 17 directory iterator。我根本没玩过这个。
答案 2 :(得分:2)
如何阅读某个目录中的任何.txt文件?
C ++ 11(请参阅n3337)和C ++ 14标准不了解directories。您可以拥有一个没有目录的系统(即使它今天不常见;但是早期MS-DOS 1没有目录),并且您可以有许多不同的file systems。
您需要来自operating system目录的支持。请记住,C ++实现可以(理论上)存在于没有任何操作系统的计算机上。
即使文件流的概念(在C ++语言规范中)也不需要与操作系统文件相关(参见this);但是在大多数C ++实现中,实际上相关。
C ++ 17正在为文件系统添加标准头<filesystem>
。但是,许多C ++实现还没有支持。请参阅C ++实现和系统的文档。
实际上,您需要操作系统支持处理目录。您可以使用Boost,Qt,POCO之类的框架。它们几乎包含特定于操作系统的服务或与目录相关的system calls。
目录的概念(在详细信息中)与操作系统和文件系统有所不同:Windows上的目录与Linux上的目录不同。甚至working directory的概念也略有不同。
在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's answer)。
换句话说,是否可以在.txt旁边放一个星号并说明读取所有.txt文件?
ifstream myFile ("*.txt");
可能不是,没有任何意义。你想迭代几个文件(然后你不会处理单 ifstream
)?你是否梦想过一些神奇的机制 - 它在实践中不存在 - 会连接所有名称以.txt
结尾的文件?按什么顺序?如果其他process同时在该目录中添加或删除文件,会发生什么?如果目录中不包含任何名称以.txt
结尾的文件,会发生什么?如果一个目录包含数以万计的文件和数TB的数据(你的硬件需要几小时或几天才能全部阅读!)?
在某些操作系统(特别是Linux)上,*.txt
是一个有效的文件路径(当然,它闻起来很糟糕,通常没有人故意创建这样的文件;但原则上可以创建这样的文件) 。在这种情况下你会期待什么行为?那个假设的工作目录包含*.txt
个文件和一些a.txt
和b.txt
?顺便说一句,在Linux上,一个文件实际上是inode(7),同一个文件可能有多个文件路径(参见link(2) ...),甚至没有。
另请阅读globbing(在各种操作系统上的工作方式不同:在Unix系统上,它通常由shell完成。在我的不完全理解中,在Windows上,它可能由某些{ {3}} - 就像启动例程一样。)
需要几天或几周才能阅读crt0以更好地了解操作系统的作用。
答案 3 :(得分:0)
ifstream
的构造函数只接受一个文件。
在提出任何问题以避免多个问题之前,请先咨询Google
答案 4 :(得分:-1)
不,你不能将“* .txt”传递给ifstream的构造函数,并期望读取这两个文件的内容。此外,您不需要两个对象,使用相同的对象,您可以一个接一个地读取这两个文件的内容。