Форум программистов, компьютерный форум CyberForum.ru

Поблочное считывание с файла - C++

Восстановить пароль Регистрация
 
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
18.04.2012, 22:34     Поблочное считывание с файла #1
Нашел-таки ошибки в своём коде шифрования DES, исправил. Теперь надо реализовать работу с файлом. Как бинарно считывать блоками по 8 байт файл? Данные на вход подаю в формате unsigned long long (так раз 8 байт). Как правильно это реализовать? И если в файле будет количество байт, которое не делится на 8... Сча буду гуглить, но мб кто-то быстрее напишет и правильнее
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2012, 22:34     Поблочное считывание с файла
Посмотрите здесь:

считывание с файла C++
Поблочное чтение из файла C++
C++ Считывание из файла
Считывание с файла C++
C++ Считывание с файла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ree.exe
56 / 56 / 4
Регистрация: 01.08.2011
Сообщений: 141
18.04.2012, 22:41     Поблочное считывание с файла #2
Вот так читается в бинарном режиме
C++
1
2
long long a;
File.read((char*)&a, sizeof(a));
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
18.04.2012, 22:53  [ТС]     Поблочное считывание с файла #3
Попробовал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 FILE *f=fopen("input.txt","rb");
 FILE *f1=fopen("output.txt","w");
 unsigned long long input;
 unsigned long long output;
 size_t result;
 while (!feof(f))
 {
  result =fread (&input,8,1,f);
  output=binary2ull(DES(input,k,true));
  fwrite (&output,8,1,f1);
  if (ferror(f)) {fputs ("Reading error",stderr); exit (3);}
 }
 fclose(f);
 fclose(f1);
 
 FILE *f2=fopen("output.txt","rb");
 FILE *f3=fopen("output2.txt","w");
 while (!feof(f2))
 {
  result =fread (&input,8,1,f2);
  output=binary2ull(DES(input,k,false));
  fwrite (&output,8,1,f3);
  if (ferror(f2)) {fputs ("Reading error",stderr); exit (3);}
 } 
 fclose(f2);
 fclose(f3);
На входе было
Код
12345 вышел зайчик погулять
После шифровки
Код
ҐКЏ7¦*л?•?A=dэLМ
После дешифровки
Код
12345 вышел зайчик погулятьпогулятьпогул
Откуда 13 лишних символов?
Ree.exe
56 / 56 / 4
Регистрация: 01.08.2011
Сообщений: 141
18.04.2012, 23:02     Поблочное считывание с файла #4
Попытайся в цикле где читаешь бинарного файла после того как считал 8 байт проверить на конец файла
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
18.04.2012, 23:06  [ТС]     Поблочное считывание с файла #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 FILE *f=fopen("input.txt","rb");
 FILE *f1=fopen("output.txt","w");
 unsigned long long input;
 unsigned long long output;
 size_t result;
 while (1)
 {
  result =fread (&input,8,1,f);
  output=binary2ull(DES(input,k,true));
  fwrite (&output,8,1,f1);
  if (ferror(f)) break;
  if (result==0) break;
 }
 fclose(f);
 fclose(f1);
 
 FILE *f2=fopen("output.txt","rb");
 FILE *f3=fopen("output2.txt","w");
 while (1)
 {
  result =fread (&input,8,1,f2);
  if (result==0) break;
  output=binary2ull(DES(input,k,false));
  fwrite (&output,8,1,f3);
 
  if (ferror(f2)) break;
 
 } 
 fclose(f2);
 fclose(f3);
так получается дешифровка нормально (уже 32 байта, а не 40). Кто шарит DES? Что делать, если нехватка байтов до кратности 8?
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
19.04.2012, 00:01     Поблочное считывание с файла #6
Цитата Сообщение от Nekto Посмотреть сообщение
Кто шарит DES? Что делать, если нехватка байтов до кратности 8?
Незнаю как в DES, а так обычно нехватку восполняют нулями.
И еще
Цитата Сообщение от Nekto Посмотреть сообщение
fopen("output.txt","w");
Цитата Сообщение от Nekto Посмотреть сообщение
fopen("output2.txt","w");
открывать на запись тоже нужно в бинароном режиме.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
19.04.2012, 02:05  [ТС]     Поблочное считывание с файла #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 if (argc!=5) { printf("Not enough arguments\n"); system("pause"); return 0; }
 FILE *f=fopen(argv[1],"rb");
 FILE *f1=fopen(argv[2],"wb");
 unsigned long long k=0;
 int length=strlen(argv[3]);
 unsigned long long temp=1ULL;
 for (int i=length-1;i>=0;i--)
 {
  k+=temp*(argv[3][i]-'0');
  temp*=10;
 }
 printf("key=%llu\n",k);
 bool action=(argv[4][0]=='1'); 
 printf("\n%s",(action)?"Coding\n":"Decoding\n");
 unsigned long long input;
 unsigned long long output;
 size_t result;
 bool END=false;
 while (1)
 {
  input=0;
  result =fread (&input,8,1,f);
  if (result==0&&!action) break;
  output=binary2ull(DES(input,k,action));
  fwrite (&output,8,1,f1);
  if (result==0&&action) break;
 }
 fclose(f);
 fclose(f1);
 system("pause");
Сделал так, вроде всё работает Конец заполняет NUL'ами, т.е. дешифрованный файл отличается от начального, если размер начального не был кратен 8. Можно теоретически хранить еще одним байтом количество бит, которые надо удалить с конца, но мне кажется, что это как-то по-другому делают.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
25.04.2012, 21:41  [ТС]     Поблочное считывание с файла #8
Чтобы не создавать новую тему... Как удалить из файла определенное количество байт? Что-то пока что не могу придумать =)

Добавлено через 24 минуты
Цитата Сообщение от Nekto Посмотреть сообщение
Чтобы не создавать новую тему... Как удалить из файла определенное количество байт? Что-то пока что не могу придумать =)
Упрощение задачи - надо файл обрезать с конца. Нашел пока SetEndOfFile() только.

Добавлено через 19 минут
C++
1
2
3
4
5
6
7
8
9
#include <cstdio>
#include <io.h>
int main()
{
 FILE *f=fopen("test.txt","a");
 int filedes = _fileno(f);
 _chsize(filedes, _filelength(filedes)-5);
 return 0;
}
Вроде работает Сам спросил - сам ответил
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
25.04.2012, 23:45     Поблочное считывание с файла #9
Обычно переписывают нужную информацию в новый файл, старый удаляют, новый переименовывают в старый.
_chsize специфичная функция, работает только под виндой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2012, 02:33     Поблочное считывание с файла
Еще ссылки по теме:

Считывание файла в массив и запись нового файла C++
C++ считывание файла
Заменить считывание с клавиатуры на считывание из файла C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
26.04.2012, 02:33  [ТС]     Поблочное считывание с файла #10
Цитата Сообщение от kazak Посмотреть сообщение
Обычно переписывают нужную информацию в новый файл, старый удаляют, новый переименовывают в старый.
_chsize специфичная функция, работает только под виндой.
А если файл 4+ гб?
Yandex
Объявления
26.04.2012, 02:33     Поблочное считывание с файла
Ответ Создать тему
Опции темы

Текущее время: 00:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru