2013-12-13 4 views
0

Я начинаю работать с C++ снова после долгого перерыва при кодировании на Java. Я пытаюсь преобразовать задание обработки данных, которое у меня есть на C++. Я столкнулся с проблемой, когда я пытаюсь открыть и записать в 100+ файлов одновременно (разбивая текстовый файл 10GB на файлы по дате). Опять же, я вернулся на C++ уже около двух дней, так что я полностью заполнен, мой код пронизан другими проблемами, но я создал простейший фрагмент, который показывает проблему.Сбой при записи в несколько файлов

  • Я могу изменить files_to_open на любое число, и у меня нет никаких проблем.
  • Если file_to_write равно < = 125, он запускает файл.
  • если файл_to_write> 125, он сработает.

Что может вызвать это?

#include <map> 
#include <sstream> 

int main() { 
    std::map<int, FILE*> files; 
    int files_to_open = 200; 
    int files_to_write = 200; 

    // Open a set of files. 
    for(int i = 0; i < files_to_open; i++) { 
    std::ostringstream file_path; 
    file_path << "E:\\tmp\\file_" << i << ".txt"; 
    files[i] = fopen(file_path.str().c_str(), "w"); 
    } 

    // Write data to files. 
    for(int i = 0; i < files_to_write; i++) { 
    printf("%d\n", i); 
    fwrite("Some Data", sizeof(char), 9, files[i]); 
    } 

    // Close files. 
    for (auto& file : files) { 
    fclose(file.second); 
    } 

    // End it all. 
    printf("Press Any Key to Continue\n"); 
    getchar(); 
    return 0; 
} 
+0

Где это крах? Я полагаю, в пишущей петле? – Trojan

+1

yep, попробуйте запустить его в отладчике ... – vines

+0

Почему вы не используете IOStreams ?? – 0x499602D2

ответ

1

Я буду считать, что FOPEN возвращается NULL когда files_to_write является> 125. Вашей ОС имеет ограничение для каждого процесса из числа дескрипторов файлов может быть открыто, и вы, вероятно, попав ограничение ,

125 имеет смысл, поскольку у вас уже есть 0 (stdin), 1 (stdout) и 2 (stderr), поэтому еще 125 будут 128, что является хорошим ограничением.

В любом случае, вы должны проверить возвращаемое значение из fopen, прежде чем слепо записи на FILE*

+0

128 немного немного для разумного предела ... – vines

+0

Вы верны, после того, как 124 fopen возвращает null. Есть ли способ поднять этот предел? – user3101015

+0

Это зависит от вашей ОС – Paladine

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