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

问题描述 投票:1回答:5

我如何读某个目录中的所有.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");
c++ ifstream
5个回答
3
投票

你会通常通过使文件的姓名(或名称)在命令行上阅读做到这一点。使用类Linux外壳,经过像foo *.txt将由外壳扩展,所以foo将获得其argc / argv适当的文件的名称。在Windows中,外壳没有做到这一点,但如果你使用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
    }
}

3
投票

自从我看到你在这里使用的窗口是FindFirstFileFindNextFile。还没有Windows机器方便,所以我不能给你的例子,但这里的资源:

FindFirstFile FindNextFile

你可以比ifstream的提取文件名。

或者你可以使用C ++ 17 directory iterator。我还没有玩过这个在所有。


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上,它可能会被一些crt0般的启动程序完成)。

需要数天或数周才能阅读Operating Systems : Three Easy Pieces更好地理解操作系统的作用。


0
投票

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

请同时参阅谷歌首次提出的任何问题,以避免多重问题之前,


-1
投票

不,你不能传递的“* .txt”来ifstream的的构造函数,并希望读这两个文件的内容。同时你并不需要两个对象,使用同一个对象,你可以读出两个文件,一前一后的内容。

© www.soinside.com 2019 - 2024. All rights reserved.