Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
#1

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

18.04.2012, 22:34. Просмотров 1170. Ответов 9
Метки нет (Все метки)

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

Поблочное чтение из файла - C++
Здравствуйте, балуюсь с чтением из файла. Так вот если читать посимвольно всё в порядке, но больно долго. А если хитро...

Заменить считывание с клавиатуры на считывание из файла - C++
Помогите пожалуйста, ни разу не работал со считыванием из файла поэтому не понимаю как и что делать. Почитал в интернете, попробовал, не...

Считывание файла в массив и запись нового файла - C++
Консоль VS C++. Текстовый файл открывается как бинарный, и считывается по 100 байт в массив - и сразу они переписываются в другой файл. В...

Считывание с файла - C++
Суть задачи такова дан файл test.txt нужно вывести на экран число таких групп букв, которые начинаются и кончаются одной и тойже...

Считывание из файла - C++
Функция: //Функция добавления новых пользователей void Add_New_User() { FILE *Fptr = fopen("New_User.txt", "r"); if (Fptr ==...

Считывание из файла - C++
#include "stdafx.h" #include <iostream> #include <conio.h> #include <fstream> #include <vector> using namespace std; void...

9
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));
1
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 лишних символов?
0
Ree.exe
56 / 56 / 4
Регистрация: 01.08.2011
Сообщений: 141
18.04.2012, 23:02 #4
Попытайся в цикле где читаешь бинарного файла после того как считал 8 байт проверить на конец файла
1
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?
0
kazak
3048 / 2369 / 160
Регистрация: 11.03.2009
Сообщений: 5,436
Завершенные тесты: 1
19.04.2012, 00:01 #6
Цитата Сообщение от Nekto Посмотреть сообщение
Кто шарит DES? Что делать, если нехватка байтов до кратности 8?
Незнаю как в DES, а так обычно нехватку восполняют нулями.
И еще
Цитата Сообщение от Nekto Посмотреть сообщение
fopen("output.txt","w");
Цитата Сообщение от Nekto Посмотреть сообщение
fopen("output2.txt","w");
открывать на запись тоже нужно в бинароном режиме.
1
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. Можно теоретически хранить еще одним байтом количество бит, которые надо удалить с конца, но мне кажется, что это как-то по-другому делают.
0
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;
}
Вроде работает Сам спросил - сам ответил
0
kazak
3048 / 2369 / 160
Регистрация: 11.03.2009
Сообщений: 5,436
Завершенные тесты: 1
25.04.2012, 23:45 #9
Обычно переписывают нужную информацию в новый файл, старый удаляют, новый переименовывают в старый.
_chsize специфичная функция, работает только под виндой.
0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
26.04.2012, 02:33  [ТС] #10
Цитата Сообщение от kazak Посмотреть сообщение
Обычно переписывают нужную информацию в новый файл, старый удаляют, новый переименовывают в старый.
_chsize специфичная функция, работает только под виндой.
А если файл 4+ гб?
0
26.04.2012, 02:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2012, 02:33
Привет! Вот еще темы с ответами:

Считывание из файла - C++
как считать из файла число, в котором оно будет задаваться в виде ASCII графики где белый цвет обозначен символом &quot;.&quot;, светло-серый - &quot;%&quot;,...

Считывание из файла - C++
Ребят, нужно сделать так чтобы программа считывала файл таким образом: первая строка (в ней число) загоняется в переменную, все следующие...

Считывание из файла - C++
Нужно считать из файла данные (по слову). Считывается только по символу. Помогите, пожалуйста, исправить. Может нужно перегрузить &gt;&gt; , если...

Считывание с файла - C++
Подскажите, плиз, как из файла в массив считать строку вместе с пробелами?


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru