2016-02-28 3 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 или около того), но до получения бесконечного вывода. Я был бы рад, если бы кто-то мог указать на ошибки, которые я делаю в коде ... Я использую gcc 5.2.1 с Linux. Спасибо!

+2

TL; DR. Но 'for (n = 1; n = 200; n ++)' генерирует предупреждение с GCC, и я предполагаю, что вы действительно имели в виду 'n <200'. Мораль истории: скомпилируйте с полными уровнями предупреждения и не считайте программу правильной, пока вы не будете на 100% без предупреждения. –

+0

Не только это - почему ваш массив 'filename' маленький? Вы рискуете перезаписать память, пытаясь микроуровнять, насколько велика эта массив. Сделайте это '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 
     }); 

Я думаю, что это чистое решение.

Смежные вопросы