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

Это то, что вы хотите?

Другие вопросы по тегам