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

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

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

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

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

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

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

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

Считывание из файла - C++
Почему при считывании строк из файла циклом вида while (!feof(f)) { fgets(line, MAX, f); printf("%s\n", line); } если...

Считывание из файла - C++
#include <iostream> #include <time> #include <fstream> using namespace std; int linear_search(int array, int size, int...

считывание из файла - 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
3034 / 2355 / 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
3034 / 2355 / 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++
Здравствуйте. подскажите как сделать, чтобы с файла считывались 2 числа, но при этом в файле это выглядит вот так : (25,16). Пытался...

Считывание из файла С++ - C++
Программа, которая считывает текст из файла и выводит его на экран, заменив цифры от &quot;0&quot; до &quot;9&quot; словами (ноль, один два), начиная каждое...

Считывание с файла - C++
Задание 1: Считать с файла и найти количество слов из 4 и менее букв. (test.txt по умолчанию в папке с программой) Вопрос: Почему он...

Считывание из файла. - 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     Поблочное считывание с файла
Ответ Создать тему
Опции темы

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