我如何读某个目录中的所有.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中,外壳没有做到这一点,但如果你使用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
}
}
自从我看到你在这里使用的窗口是FindFirstFile
,FindNextFile
。还没有Windows机器方便,所以我不能给你的例子,但这里的资源:
你可以比ifstream的提取文件名。
或者你可以使用C ++ 17 directory iterator。我还没有玩过这个在所有。
我如何在某个目录读取任何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上,它可能会被一些crt0般的启动程序完成)。
需要数天或数周才能阅读Operating Systems : Three Easy Pieces更好地理解操作系统的作用。
ifstream
的构造函数接受只有一个文件。
请同时参阅谷歌首次提出的任何问题,以避免多重问题之前,
不,你不能传递的“* .txt”来ifstream的的构造函数,并希望读这两个文件的内容。同时你并不需要两个对象,使用同一个对象,你可以读出两个文件,一前一后的内容。