fseek создает бесконечный цикл во время выполнения
ЧТО ДЕЛАЕТ КОД: Я читаю двоичный файл и сортирую его. Я использую массив частот, чтобы сделать это. ОБНОВЛЕНИЯ: это делает цикл, но он не пишет цифры правильно...
Это код. Я хочу написать в файл после прочтения из него. Я опишу то, что уже написано, и это хорошо. Проблема в том, что у меня нет ошибок при компиляции, но во время выполнения кажется, что у меня бесконечный цикл. Файл является двоичным. Я читаю его побайтово, и я тоже хочу это написать.
while(fread(readChar, sizeof(readChar)/2, 1, inFile)){
bit = atoi(readChar);
array[bit] = array[bit] + 1;
}
fseek(inFile, 0, SEEK_SET);
for( i = 0; i < 256; i++)
while(array[i] > 0){
writeChar[0] = array[i]; //do I correctly convert int to char?
fwite(writeChar, sizeof(readChar)/2, 1, inFile);
array[i] = array[i] -1;
}
Объявление файла inFile:
FILE* inFile = fopen (readFile, "rb+");
Читает из файла, но не пишет!
2 ответа
Неопределенное поведение:
fread()
используется для чтения двоичного представления данных. atoi()
принимает текстовое представление данных: строку (указатель на массив char
который заканчивается с '\0'
,
Если только данные не прочитаны в readChar
имеет один из байтов, равный 0, вызывая atoi()
может получить доступ к данным за пределами readChar
,
fread(readChar, sizeof(readChar)/2, 1, inFile);
bit = atoi(readChar);
Кодируйте, не читая данные "по крупицам". В комментариях @Jens: "Наименьшая единица - это байт". и это по крайней мере 8 бит.
Я вижу единственную возможную причину бесконечного цикла в том, что ваш массив не инициализирован.
После декларации с:
int array[256];
элементы могут иметь любое целочисленное значение, в том числе очень большое.
Так что бесконечных циклов не существует, но некоторые циклы могут иметь очень много итераций.
Вы должны инициализировать ваш массив с нулями:
int array[256]={0};
Я не знаю, сколько элементов в вашем массиве, и если вы так объявите, но если вы объявите свой массив, как показано, то ={0}
инициализирует все члены с 0. Вы также можете использовать цикл:
for(int i=0; i < COUNT_OF_ELEMENTS;i++) array[i] = 0;
РЕДАКТИРОВАТЬ: я забыл упомянуть, что ваш код может сортировать файлы только с номерами внутри.
Для этого вы также должны изменить conversion
во время написания:
char writeChar[2]={0};
for( int i = 0; i < 256; i++)
while(array[i] > 0){
_itoa(i,writeChar,10);
fwrite(writeChar, sizeof(char), 1, inFile);
array[i] = array[i] -1;
}
Содержимое файла до:12345735280735612385478504873457835489
Содержание файла после:00112223333334444455555556777778888889
Это то, что вы хотите?