2016-02-28 107 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 
     }); 

我认为这是一个清晰的解决方案。