繁体   English   中英

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

[英]C++ How Do I Read All .txt Files in a Directory?

如何读取特定目录中的所有.txt文件? 假设在我的C:\\我有一个foo.txtfoo2.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,因此这里是FindFirstFileFindNextFile 不需要Windows机器,因此我无法举个例子,但是这里有资源:

FindFirstFile FindNextFile

然后,您可以提取ifstream的文件名。

或者,您可以使用C ++ 17 目录迭代器 我根本没有玩过。

如何读取特定目录中的任何.txt文件?

C ++ 11(请参阅n3337 )和C ++ 14标准不了解目录 您可能拥有一个没有目录的系统(即使今天并不常见;但是早期的MS-DOS 1没有目录),并且您可以拥有许多不同的文件系统

您需要操作系统对目录的支持。 请记住,从理论上讲,C ++实现可以在没有任何操作系统的计算机上存在。

甚至文件流的概念(在C ++语言规范中)也不需要与操作系统文件相关(请参阅参考资料 )。 但是,在大多数C ++实现中,它实际上是相关的。

C ++ 17正在为文件系统添加标准头<filesystem> 但是,许多C ++实现尚不支持该功能。 请参考您的C ++实现和系统的文档。

实际上,您需要操作系统的支持来处理目录。 您可以使用诸如BoostQtPOCO之类的框架。 实际上,它们包装了与目录有关的特定于操作系统的服务或系统调用

目录的概念(在详细信息中)随操作系统和文件系统而异: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.txtb.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM