C ++如何读取目录中的所有.txt文件?

时间:2018-03-25 06:04:55

标签: c++ ifstream

如何读取某个目录中的所有.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");

5 个答案:

答案 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)

由于我发现您在这里使用的是FindFirstFileFindNextFile。没有Windows机器,所以我不能给你举例,但这里有资源:

FindFirstFile FindNextFile

您可以提取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 ++实现和系统的文档。

实际上,您需要操作系统支持处理目录。您可以使用BoostQtPOCO之类的框架。它们几乎包含特定于操作系统的服务或与目录相关的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.txtb.txt?顺便说一句,在Linux上,一个文件实际上是inode(7),同一个文件可能有多个文件路径(参见link(2) ...),甚至没有。

另请阅读globbing(在各种操作系统上的工作方式不同:在Unix系统上,它通常由shell完成。在我的不完全理解中,在Windows上,它可能由某些{ {3}} - 就像启动例程一样。)

需要几天或几周才能阅读crt0以更好地了解操作系统的作用。

答案 3 :(得分:0)

ifstream的构造函数只接受一个文件。

在提出任何问题以避免多个问题之前,请先咨询Google

答案 4 :(得分:-1)

不,你不能将“* .txt”传递给ifstream的构造函数,并期望读取这两个文件的内容。此外,您不需要两个对象,使用相同的对象,您可以一个接一个地读取这两个文件的内容。