簡體   English   中英

C - 讀取多個文件

[英]C - Reading multiple files

我對如何解決我面臨的某個問題提出了一般性問題。 我對C很新,所以請耐心等待。 假設我有一個包含1000多個文本文件的文件夾,這些文件沒有以任何編號順序命名,但它們是按字母順序排列的。 對於我的問題,我有庫存數據文件,每個文件都以公司各自的股票代碼命名。 我想寫一個程序打開每個文件,讀取數據找到歷史低點並將其與當前價格進行比較並計算百分比變化,然后打印出來。 搜索和計算不是問題,問題是讓程序通過並打開每個文件。 我可以看到攻擊這個的唯一方法是創建一個包含所有股票代碼的文本文件,讓程序將其讀入數組,然后運行一個循環,首先打開數組中的第一個文件名,執行計算,打印輸出,關閉文件,然后循環回到數組中的第二個元素(下一個自動收錄器符號)。 設置起來相當簡單(我認為),但我真的想避免在文本文件中輸入超過一千個文件名。 有沒有更好的方法來解決這個問題? 不是真的要求代碼(除非在c中有一些令人驚訝的功能可以為我做這個;)),只是來自更有經驗的C程序員的一些建議。

謝謝 :)

編輯:這是在Linux上,抱歉,我忘記了!

在Linux / Unix(BSD,OS X,POSIX等)下,您可以使用opendir / readdir來完成目錄結構。 當文件系統具有您想要的信息時,無需生成需要更新的靜態文件。 如果您只想在給定時間內獲得一組股票,那么使用glob會更快,還有scandir

如果您使用Visual C ++作為C編譯器進行開發,我不知道調用了什么Win32(Windows / Platform SDK)函數。 搜索MSDN Library應該可以幫到您。

假設你在linux上運行......

ls /path/to/text/files > names.txt

正是你想要的。

標准C中沒有任何具有“目錄”概念的功能。 您需要使用某種特定於平台的功能來執行此操作。 有關示例,請查看Cprogrammnig.com上的這篇文章

就個人而言,我更喜歡使用opendir() / readdir()方法,如第二個例子所示。 如果您使用的是Cygwin,它可以在Linux下本地運行,也可以在Windows上運行。

方法1)我只有一個特定的目錄,我只有這些文件包含自動收報機數據,沒有別的。 然后,我將使用C readdir API列出目錄中的所有文件,並迭代執行所需數據處理的每個文件。 文件適用的哪個滾動條僅由文件名確定。

優點:易於編碼

缺點:這取決於文件存儲的位置和來源。

方法2)更改文件格式,以便自動收報機文件以識別這是一個自動收報機文件的魔術代碼和包含該名稱的字符串開頭。 和之前一樣,使用readdir遍歷文件夾中的所有文件並打開每個文件,確保設置了幻數並從文件中讀取了自動收錄器名稱,並像以前一樣處理數據

優點:比以前更靈活。 文件名無需反映股票代碼的名稱缺點:代碼更難,文件格式可能是固定的。

但我真的想避免在文本文件中輸入超過一千個文件名。 有沒有更好的方法來解決這個問題?

我已經解決了相同的問題,雖然個人用途:)

我所做的是使用OS shell命令生成這些文件的列表,並將輸出重定向到文本文件並讓我的程序運行它們。

在偽代碼中它看起來像這樣,我無法定義代碼,因為我不是100%確定這是否是正確的方法...

for each directory entry
    scan the filename
         extract the ticker name from the filename
         open the file
              read the data
              create a record consisting of the filename, data.....
         close the file
         add the record to a list/array...
> sort the list/array into alphabetical order based on 
  the ticker name in the filename...

如果您願意,可以稍微改變它,掃描目錄條目中的文件名並首先通過首先構建帶有文件名的記錄對它們進行排序,然后返回列表/數組的開頭並單獨打開每個文件讀取數據並放入它進入記錄然后....

希望這有助於,最好的問候,湯姆。

在UNIX上,有方便的glob函數:

glob_t results;
memset(&results, 0, sizeof(results));
glob("*.txt", 0, NULL, &results);
for (i = 0; i < results.gl_pathc; i++)
    printf("%s\n", results.gl_pathv[i]);
globfree(&results);

在Linux或相關系統上,您可以使用fts庫。 它專為遍歷文件層次結構而設計: man fts

甚至像readdir這樣簡單的東西

如果在Windows上,您可以使用其目錄管理 API。 更具體地說, FindFirstFile函數與通配符一起使用,與FindNextFile結合使用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM