C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Массив байтов, помогите разобраться.  (Прочитано 4698 раз)
Stydent123
новенький
*

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 1


« : 11 июля 2015, 07:56:45 »

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

Сказали спасибо: +1113/-22
Offline Offline

Сообщений: 2137

S0mbre


WWW
« Ответ #1 : 13 июля 2015, 08:33:11 »

Как-то так.

Код
#include <stdio.h>
//#include <stdlib.h> // для srand(), rand()
//#include <time.h>         // для time()
 
const char* INFILE = "C:\\input.bin"; // входной файл
const char* OUTFILE = "C:\\output.bin";     // выходной файл
const int PACKAGEL = 5;                     // размер пакета в байтах
const int INBYTES = 4;                      // размер значимых данных (=4 байта)
 
int _tmain(int argc, _TCHAR* argv[])
{
// заполнить входной файл данными (только для первого раза)
/*
FILE* pFileIn = fopen(INFILE, "wb");
if(pFileIn == NULL) { fputs("File error", stderr); return 1; }
 
int n = 0;
srand(time(NULL));
 
for(int i=0; i<1000; i++) {
fputc(0, pFileIn);
n = rand() % 1000;
fwrite(&n, sizeof(int), 1, pFileIn);
}
 
fclose(pFileIn);
*/

 
// открыть входной файл для чтения данных
FILE* pFileIn = fopen(INFILE, "rb");
if(pFileIn == NULL) { fputs("File error 1", stderr); return 1; }
// создать выходной файл для записи данных
FILE* pFileOut = fopen(OUTFILE, "wb");
if(pFileOut == NULL) { fputs("File error 2", stderr); return 2; }
 
// буфер для чтения / записи данных
char* buffer = NULL;
 
try {
// размер типа char (1 байт)
const int CHARSZ = sizeof(char);
 
// получить размер входного файла в байтах
fseek(pFileIn, 0, SEEK_END); // прокрутить в конец файла
const long lSize = ftell(pFileIn);      // получить значение указателя
rewind(pFileIn);                        // прокрутить в начало файла
 
// получить кол-во пакетов данных (размер файла / размер пакета)
const long PACKAGEC = lSize / PACKAGEL;
// выделить память поб буфер данных (=4 байта)
buffer = new char[CHARSZ*INBYTES];
 
// цикл по кол-ву пакетов данных во входном файле
for(long i=0; i<PACKAGEC; i++) {
// прочитать 1-ый байт в пакете и записать его в выходной файл
fputc(fgetc(pFileIn), pFileOut);
// прочитать слудующие 4 значимых байта
if(fread(buffer, CHARSZ, INBYTES, pFileIn) != INBYTES) {
// ошибка чтения
fputs("Reading error", stderr);
throw 3;
}
// записать эти данные в выходной файл
if(fwrite(buffer, CHARSZ, INBYTES, pFileOut) != INBYTES) {
// ошибка записи
fputs("Writing error", stderr);
throw 4;
}
// если четный пакет, продублировать значимые байты в выходном файле
if(i == 1 || (i%2) != 0) fwrite(buffer, CHARSZ, INBYTES, pFileOut);
}
}
// обработка исключений
catch(int& err) {
// освободить память под буфер
if(buffer) delete [] buffer;
// закрыть входной и выходной файлы
fclose(pFileIn);
fclose(pFileOut);
// вернуть номер исключения
return err;
}
 
// освободить память под буфер
if(buffer) delete [] buffer;
// закрыть входной и выходной файлы
fclose(pFileIn);
fclose(pFileOut);
 
// вернуть 0 (все ок!)
return 0;
}
 
« Последнее редактирование: 13 июля 2015, 08:42:39 от S0mbre » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в: