У меня проблема с сохранением большого количества данных в двоичный файл в C ++, я использую CodeBlocks
Мой код:
long tablica[10000];
int main(int argc, char *argv[])
{
FILE * pFile;
clock_t start,stop;
srand (time(NULL));
long i;
for(i=0;i<10000;i++){
tablica[i] = rand() % 100000;
}
start = clock();
pFile = fopen ("myfile.bin","wb");
if (pFile!=NULL)
{
long test = fwrite(tablica,sizeof(long),sizeof(tablica),pFile);
int err = ferror(pFile);
fclose(pFile);
printf("%d",err);
}
double wynik;
wynik = double(stop-start);
printf("\n %f",wynik);
return 0;
}
Он просто выдает много данных и сохраняет их в файл.
Странно то, что при компиляции и запуске из профиля DEBUG он работает хорошо, а при запуске из релиза выдает ошибку num 32 Broken Pipe
Я пошел, чтобы построить параметры, и кажется, что производить символы debugging делает различие, когда это в записи файла, является успешным, и если это выключено, я получаю сломанную трубу.
Может ли кто-нибудь1 рассказать, почему возникает эта проблема и как ее устранить. Мне нужно, чтобы мое приложение было довольно быстрым, и я думаю, что создание символов отладки замедлит его.
Проблема здесь:
long test = fwrite(tablica,sizeof(long),sizeof(tablica),pFile);
Вызов sizeof для массива возвращает размер массива в байтах, а не количество элементов, как описано здесь:
Как определить размер моего массива в C?
Итак, вы говорите fwrite написать 40000 длинных, а не 10000 длинных.
Причина, по которой он работает в режиме отладки, но не в выпуске, возможно, связана с проверками во время выполнения отладки. (Хотя вы не указываете, какую платформу / компилятор / среду выполнения вы используете, поэтому трудно сказать наверняка.)
Я бы исправил это так:
long test = fwrite(tablica,1,sizeof(tablica),pFile);
И вы действительно должны проверять это «тестовое» возвращаемое значение.
Кроме того, вместо того, чтобы пытаться записать все данные за один снимок, я сделал бы серию вызовов fwrite в цикле, записывая, скажем, килобайт (1024 байта) за раз.