2016-02-28 64 views
1

我有成百上千的.txt文件按數字排序:1.txt,2.txt,3.txt,... n.txt。在每個文件中有兩列有十進制數字。 我寫了一個算法,它只對一個.txt文件進行一些操作,現在我想遞歸地對它們進行相同的操作。 This helpful question給了我一些我想要做的事情。 現在我想要寫一個算法來讀取所有文件:C++ - 順序打開文本文件

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 
int main() 
{ 
int i, n; 
char filename[6]; 
double column1[100], column2[100]; 
for (n=1;n=200;n++) 
{ 
sprintf(filename, "%d.txt", n); 
ifstream datafile; 
datafile.open(filename); 
    for (i=0;i<100;i++) 
    { 
    datafile >> column1[i] >> column2[i]; 
    cout << column1[i] << column2[i]; 
    } 
datafile.close(); 
} 
return 0; 
} 

我覺得代碼是這樣做的:它是從的1.txt直到200.txt創建的字符串名稱,然後將它打開文件與這些名字。對於每個文件,前100列將與數組column1和column2相關聯,然後這些值將顯示在屏幕上。 編譯它時我沒有收到任何錯誤,但是當我運行它時,輸出是巨大的,並且不會停止。如果我將輸出設置爲一個.txt文件,它很容易達到一些Gb! 我也嘗試減少循環數和減少列數(3左右),但我直到得到無限的輸出。我會很高興,如果有人可以指出我在代碼中所犯的錯誤... 我在Linux上使用gcc 5.2.1。 謝謝!

+2

TL; DR。但是對於(n = 1; n = 200; n ++)'用GCC產生一個警告,我的第一個猜測就是你的意思是'n <200'。故事的道德:編寫完整的警告級別,並且在100%無警告之前不要考慮程序是否正確。 –

+0

不僅如此,爲什麼你的'filename'數組很小?試圖微觀管理這個陣列的規模有多大,你會冒着內存覆蓋的風險。使它成爲'文件名[25]'並完成它。 – PaulMcKenzie

+0

@ChristianHackl:如果他們曾經在那裏,我就讀不出任何警告。無論如何感謝您指出錯誤。 PaulMcKenzie:我認爲長度爲8(不是6)就足夠了,因爲我有最多7個符號的文件名。謝謝你的建議! – porfavorinho

回答

3
  • 6元素陣列太短而無法存儲"200.txt"。它必須至少有8個元素。
  • 條件n=200是錯誤的,並始終如此。它應該是n<=200
+0

我完全監督這個!謝謝! – porfavorinho

+0

@hilberdream如果它解決了您的問題,請記住標記爲答案 – ti7

0

如果您的所有文件在同一目錄中,你也可以使用boost::filesystem,例如:

auto path = "path/to/folder"; 
std::for_each(boost::filesystem::directory_iterator{path}, 
     boost::filesystem::directory_iterator{}, 
     [](boost::filesystem::directory_entry file){ 
      // test if file is of the correct type 
      // do sth with file 
     }); 

我認爲這是一個清晰的解決方案。