Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2011, 18:49   #1
Pecho
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 37
По умолчанию Считывание из файла блоками. Си

Доброго времени суток!
Нужно было написать программу блочного шифрования, всё замечательно вышло, только возникла проблема со считыванием блоков из файла.
Если я убираю цикл while, то прога считывает первые 8 байт файла из OpenFile, шифрует их (Blok[2]-глобальная переменная-массив, в которую записываются результаты преобразований над left и rigth), записывает в ResultFile. При расшифровке ResultFile, получается то, что было в OpenFile, т.е. всё работает как надо.
Но нужно через Encrypt пропустить весь файл, поэтому добавляю цикл. В итоге после шифровки/расшифровки с OpenFile совпадают только первые 8 байт ResultFile.
Как передалать цикл так, чтобы считывание из OpenFile осуществлялось блоками по 8 байт?

Код:
#include <stdio.h>
#include <string.h>
unsigned int Blok[2]; //блок с лев и прав полублоками
........
FILE *OpenFile, *KeyFile, *ResultFile;
unsigned char bits[8]; //блок 64 бита
unsigned int i, rc; //i-счётчик цикла, rc-вспомог переменная    
........
        //открываем файл откр текста, отлов ошибки
if((OpenFile=fopen("/home/alexander/test","rb"))==NULL)
{
        printf("Ошибка открытия файла шифрованного текста");
        return 1;
}
        //пока не считаем файл с откр текстом до конца...
while (!feof(OpenFile))
{
        memset(bits,0,sizeof(bits));//обнуляем блок
        for (i=0; (rc=fgetc(OpenFile))!=EOF && i<sizeof(bits);bits[i++]=rc)//считываем 64 бита
                ;
        //Записываем первые 4 байта в левый блок                
        unsigned char left[4]={bits[0],bits[1],bits[2],bits[3]};
        //Записываем вторые 4 байта в правый блок
        unsigned char rigth[4]={bits[4],bits[5],bits[6],bits[7]};
        //Передача массивов в процедуру шифрования и запись результата в итоговый файл
        Encrypt(&(left[0]),&(rigth[0]));
 
        unsigned char cr[8];
        for (j=0; j<8; j++)
        {
                cr[j] = (Blok[j/4]>>(24-(j*8)%32))&0xff;
                fputc(cr[j],ResultFile);
        }
}
........
Pecho вне форума Ответить с цитированием
Старый 20.02.2011, 19:04   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
for (i=0; (rc=fgetc(OpenFile))!=EOF && i<sizeof(bits);bits[i++]=rc)//считываем 64 бита
А что fread уже отменили? Посмотри примеры с ней, оч неплохая функция для считывания поблочно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.02.2011, 19:31   #3
Pecho
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 37
По умолчанию

А можно подробнее?
Pecho вне форума Ответить с цитированием
Старый 20.02.2011, 19:52   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну почему же нет?
вот примеры:
http://www.programmersforum.ru/showthread.php?t=59088
http://www.programmersforum.ru/showthread.php?t=105501
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.02.2011, 19:53   #5
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

http://www.cplusplus.com/reference/c.../cstdio/fread/
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 20.02.2011, 20:05   #6
Pecho
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 37
По умолчанию

Спасибо большое!
В итоге вместо
Код:
for (i=0; (rc=fgetc(OpenFile))!=EOF && i<sizeof(bits);bits[i++]=rc)
нужно написать
Код:
for(i=0;i<8;i++)
{
   fread(&bits[i],1,1,OpenFile);
}
и всё работает!
Pecho вне форума Ответить с цитированием
Старый 20.02.2011, 20:41   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну даешь... )))))
Я имел ввиду сам цикл заменить
Код:
 fread(&bits[i],8,1,OpenFile);
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Считать блоками по 64 бит из файла. С Pecho Помощь студентам 5 04.02.2011 15:15
считывание с файла G.I.JOE Общие вопросы C/C++ 2 06.06.2010 09:18
c++ считывание с файла. tsergey Помощь студентам 20 24.04.2010 23:30
Считывание с файла на С++ lamak Помощь студентам 8 01.11.2009 22:18
Считывание из файла DimkinStd Общие вопросы Delphi 7 24.01.2007 19:18