[英]C++ How Do I Read All .txt Files in a Directory?
如何讀取特定目錄中的所有.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上,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,因此這里是FindFirstFile
, FindNextFile
。 不需要Windows機器,因此我無法舉個例子,但是這里有資源:
然后,您可以提取ifstream的文件名。
或者,您可以使用C ++ 17 目錄迭代器 。 我根本沒有玩過。
如何讀取特定目錄中的任何.txt文件?
C ++ 11(請參閱n3337 )和C ++ 14標准不了解目錄 。 您可能擁有一個沒有目錄的系統(即使今天並不常見;但是早期的MS-DOS 1沒有目錄),並且您可以擁有許多不同的文件系統 。
您需要操作系統對目錄的支持。 請記住,從理論上講,C ++實現可以在沒有任何操作系統的計算機上存在。
甚至文件流的概念(在C ++語言規范中)也不需要與操作系統文件相關(請參閱參考資料 )。 但是,在大多數C ++實現中,它實際上是相關的。
C ++ 17正在為文件系統添加標准頭<filesystem>
。 但是,許多C ++實現尚不支持該功能。 請參考您的C ++實現和系統的文檔。
實際上,您需要操作系統的支持來處理目錄。 您可以使用諸如Boost , Qt , POCO之類的框架。 實際上,它們包裝了與目錄有關的特定於操作系統的服務或系統調用 。
目錄的概念(在詳細信息中)隨操作系統和文件系統而異: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.txt
和b.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.