кодовые блоки — C ++ fwrite, код ошибки 36 Broken Pipie

У меня проблема с сохранением большого количества данных в двоичный файл в 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 рассказать, почему возникает эта проблема и как ее устранить. Мне нужно, чтобы мое приложение было довольно быстрым, и я думаю, что создание символов отладки замедлит его.

0

Решение

Проблема здесь:

long test = fwrite(tablica,sizeof(long),sizeof(tablica),pFile);

Вызов sizeof для массива возвращает размер массива в байтах, а не количество элементов, как описано здесь:
Как определить размер моего массива в C?

Итак, вы говорите fwrite написать 40000 длинных, а не 10000 длинных.

Причина, по которой он работает в режиме отладки, но не в выпуске, возможно, связана с проверками во время выполнения отладки. (Хотя вы не указываете, какую платформу / компилятор / среду выполнения вы используете, поэтому трудно сказать наверняка.)

Я бы исправил это так:

long test = fwrite(tablica,1,sizeof(tablica),pFile);

И вы действительно должны проверять это «тестовое» возвращаемое значение.

Кроме того, вместо того, чтобы пытаться записать все данные за один снимок, я сделал бы серию вызовов fwrite в цикле, записывая, скажем, килобайт (1024 байта) за раз.

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector