2013-09-15 2 views
0

Я пишу патроны чата * ptr в файл, но мне нужно так долго заканчивать. Я не знаю почему.Что может привести к тому, что функция fwrite() настолько медленная

for(int i = 1; i < 64048; i++){ 
    if(ptr[i] != NULL){ 
     fwrite(ptr[i], 1, strlen(ptr[i])-6, file); 
     free(ptr[i]); 
    } 
} 

есть массив символьных указателей, хранящих 8186 байт, и я хочу, чтобы записать в файл, но время так долго.

У меня 64048 кусков строки необходимо записать в файл.

Что может привести к замедлению работы fwrite() ??

спасибо

+2

Сколько времени это займет? Вы пишете файл размером 8186 x 64048 или более 500 МБ. Я мог понять, почему это займет много времени. – lurker

+0

Есть ли способ избежать вызова strlen? –

+0

Взял около 10 минут, чтобы закончить, мне нужно передать более 1 ГБ файла по UDP. Пока что я тестирую только 500 МБ. –

ответ

3

OP использует неправильный метод размера fwrite(), среди других мелких ошибок.

Если «массив символьных указателей, хранящих 8186 байт» означает
1 каждая char массив имеет значительные 8186 байт данных, использование размера 8186.
2 каждый char массив представляет собой завершенную нулем строку, то испытание должно произойти для обеспечения каждого из них, по крайней мере, длина 6. Не уверен, что это такое 6. Примечание: size_t fwrite (const void * ptr, size_t size, size_t count, FILE * stream)

Я подозреваю, что OP-х - 6 вызывает проблему, когда strlen(ptr[i]) меньше 6. Это сделало бы отрицательную разницу в очень большой size_t, который, как правило, без знака для count в fwrite().

for(int i = 0; i < 64048; i++){ // start at 0 
    if(ptr[i] != NULL){ 
     int result; 

     result = fwrite(ptr[i], 1, 8186, file); 
     if (result != 8186) ; handle error; 

     // or 

     size_t len = strlen(ptr[i]) + 1; /// Add 1 for the NUL byte 
     if (len < 6) ; handle error of whatever the OP's 6 is about. 
     result = fwrite(ptr[i], 1, len, file); 
     if (result != len) ; handle error; 

     free(ptr[i]); 
    } 
} 
Смежные вопросы