Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Массив байтов


Автор: Stydent123 11.7.2015, 08:04
Здравствуйте, с битами и байтами я никогда не работал, но приходится в быстром темпе изучать. Так вот в чём вопрос.
В файл записаны пакеты данных по 5 байт, пакетов около 1000. Первый байт информационного характера, а 2-5 32-х разрядное число, мне нужно нужно открыть этот файл нечётные пакеты оставить без изменения, а в чётных продублировать 32-х разрядное число и записать его после 5 байта в итоге получится структура:
5 байт
9 байт
5 байт
9 байт и т.д.
И потом всё это записать в файл.
В инете слишком много разношёрстной информации и голова уже от этого кругом.
Спасибо за помощь.

Автор: borisbn 11.7.2015, 12:07
Код

#include <stdio.h>

int main()
{
    FILE * f_in = fopen( "in_file.dat", "rb" );
    FILE * f_out = fopen( "out_file.dat", "wb" );
    if ( f_in == 0 || f_out == 0 ) {
        printf( "Can't open or create file\n" );
        return 1;
    }
    while ( ! feof( f_int ) ) {
        // even
        char firstByte;
        if ( 1 != fread( & firstByte, 1, sizeof( firstByte ), f_in ) ) {
            break;
        }
        fwrite( & firstByte, 1, sizeof( firstByte ), f_out );
        int secondInt;
        if ( 1 != fread( & secondInt, 1, sizeof( secondInt ), f_in ) ) {
            break;
        }
        fwrite( & secondInt, 1, sizeof( secondInt ), f_out );

        // odd
        if ( 1 != fread( & firstByte, 1, sizeof( firstByte ), f_in ) ) {
            break;
        }
        int secondInt;
        if ( 1 != fread( & secondInt, 1, sizeof( secondInt ), f_in ) ) {
            break;
        }
    }
    fclose( f_in );
    fclose( f_out );
}

Автор: volatile 11.7.2015, 13:08
Цитата(borisbn @  11.7.2015,  12:07 Найти цитируемый пост)
if ( 1 != fread( & secondInt, 1, sizeof( secondInt ), f_in ) )

С чисто сишными легко напутать
borisbn, если не ошибаюсь, здесь при удачном чтении, он вернет sizeof (secondInt)
нужно как минимум переставить местами
Цитата
if ( 1 != fread( & secondInt, 1, sizeof( secondInt ), 1, f_in ) )


Автор: borisbn 11.7.2015, 13:48
Цитата(volatile @  11.7.2015,  13:08 Найти цитируемый пост)
нужно как минимум переставить местами

Ой.. Да. Писал не в студии, и, соответственно, без подсказчика.

2 Stydent123, обрати внимание, что в fread (лучше в обоих) нужно переставить местами второй и третий параметры

Автор: Stydent123 13.7.2015, 07:29
borisbn, volatile спасибо за помощь! Буду разбираться.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)