簡體   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