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

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

Войти
Регистрация
Восстановить пароль
 
anton27
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 14
#1

Из заданного двоичного файла создать новый двоичный файл, у которого байты переставлены в обратном порядке - C++

06.06.2014, 14:55. Просмотров 538. Ответов 7
Метки нет (Все метки)

7. По заданному двоичному файлу с произвольным содержанием создать новый двоичный файл, у которого байты переставлены в обратном порядке. Вывести содержимое исходного и итогового файлов на экран.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2014, 14:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Из заданного двоичного файла создать новый двоичный файл, у которого байты переставлены в обратном порядке (C++):

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

Дан файл целых чисел. Создать новый файл, содержащий те же элементы, что и исходный файл, но в обратном порядке - C++
Пожалуйста, помогите решить задачу в C++!!! Дан файл целых чисел. Создать новый файл, содержащий те же элементы, что и исходный файл, но...

Дан файл, компонентами которого являются символы. Переписать все символы в новый файл в обратном порядке. - C++
Работа с текстовыми файлами. Дан файл, компонентами которого являются символы. Переписать все символы в новый файл в обратном порядке.

Переписать строки файла в обратном порядке в новый файл - C++
имеется текстовый файл. переписать его строки в обратном порядке(справа налево) в другой файл . порядок строк во втором файле должен быть...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zer0mail
2334 / 1960 / 192
Регистрация: 03.07.2012
Сообщений: 7,029
Записей в блоге: 1
06.06.2014, 19:48 #2
Зачем дублировать темы: Переставить байты исходного файла в обратном порядке ?
0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
06.06.2014, 20:39 #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <fstream>
 
int main()
  {
  std::ifstream source("source.txt", std::ios::binary);
  std::ofstream destination("destination.txt", std::ios::binary);
  
  source.seekg(-1, source.end);
  while (source.good())
    {
    char temporary_char;
    source.get(temporary_char);
    destination.write(&temporary_char, 1);
    source.seekg(-2, source.cur);
    }
  return 0;
  }
0
zer0mail
2334 / 1960 / 192
Регистрация: 03.07.2012
Сообщений: 7,029
Записей в блоге: 1
07.06.2014, 07:59 #4
Для вывода на экран годится, но для файла мегабайт этак на 500 - нет. Специально проверил - скорость ~0.1мег/сек (а для эффективного алгоритма должна быть ~50мб/сек).
0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
07.06.2014, 11:19 #5
Цитата Сообщение от zer0mail Посмотреть сообщение
Для вывода на экран годится, но для файла мегабайт этак на 500 - нет. Специально проверил - скорость ~0.1мег/сек (а для эффективного алгоритма должна быть ~50мб/сек).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <fstream>
#include <iterator>
#include <vector>
 
int main()
  {
  std::ifstream source("source.txt", std::ios::binary);
 
  source.seekg(0, source.end);
  std::vector<char> buffer(static_cast<size_t>(source.tellg()));
  source.seekg(0, source.beg);
  source.read(&buffer[0], buffer.size());
  source.close();
 
  std::ofstream destination("destination.txt", std::ios::binary);
  std::copy(buffer.rbegin(), buffer.rend(), std::ostream_iterator<char>(destination));
  return 0;
  }
Вот целиком Находишь оптимальный размер буфера и делаешь золотую середину между "весь файл в памяти" и "буфер 1 байт". Есть такая утилитка "tac", сорцы в свободном доступе. Можно в них посмотреть, как правильно это делать. Не бенчмаркал, хз как острим_итератор себя поведет по скорости Мб быстрее будет развернуть вектор целиком в памяти и уже подать цельным куском офстриму.
0
zer0mail
2334 / 1960 / 192
Регистрация: 03.07.2012
Сообщений: 7,029
Записей в блоге: 1
08.06.2014, 12:32 #6
Я просто читал с конца по мегабайту, копировал в обратном порядке в другой буфер и записывал. Получилось ~50 мб/сек
Интересно, сколько гиг можно запихать в вектор и как долго будет копироваться?

Добавлено через 11 часов 32 минуты
Если копировать 200 Мб (такой файл целиком влезает в память), то скорость ~0.25Мб/сек
1 Гиг тоже копируется, но немного медленней, а 1.9Гиг не влезает в память (ОС WinXP 32)...

Вывод: не надо искать сложных медленных решений там, где работают простые и быстрые
0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
08.06.2014, 13:16 #7
Цитата Сообщение от zer0mail Посмотреть сообщение
Я просто читал с конца по мегабайту, копировал в обратном порядке в другой буфер и записывал. Получилось ~50 мб/сек
Интересно, сколько гиг можно запихать в вектор и как долго будет копироваться?

Добавлено через 11 часов 32 минуты
Если копировать 200 Мб (такой файл целиком влезает в память), то скорость ~0.25Мб/сек
1 Гиг тоже копируется, но немного медленней, а 1.9Гиг не влезает в память (ОС WinXP 32)...

Вывод: не надо искать сложных медленных решений там, где работают простые и быстрые
1*666*713*278 обработало за
Finished reading file (18517 ms)
Finished reversing (1170 ms)
Finished saving (10935 ms)
~ 54429622 B/s
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
#include <iostream>
#include <fstream>
#include <vector>
#include <Windows.h>
 
int main()
  {
  unsigned long long ticks1 = GetTickCount64();
  std::ifstream source("C:/Users/Nekto/Downloads/VIDEO/Supernatural.S09E20.Bloodlines.1080p.WEB-DL.DD5.1.H.264-ECI [PublicHD]/Supernatural.S09E20.Bloodlines.1080p.WEB-DL.DD5.1.H.264-ECI.mkv", std::ios::binary);
 
  source.seekg(0, source.end);
  std::vector<char> buffer(static_cast<size_t>(source.tellg()));
  source.seekg(0, source.beg);
  source.read(&buffer[0], buffer.size());
  unsigned long long ticks2 = GetTickCount64();
  std::cout << "Finished reading file (" << ticks2 - ticks1 << " ms)" << std::endl;
  source.close();
 
  ticks1 = GetTickCount64();
  std::reverse(buffer.begin(), buffer.end());
  ticks2 = GetTickCount64();
  std::cout << "Finished reversing (" << ticks2 - ticks1 << " ms)" << std::endl;
 
  ticks1 = GetTickCount64();
  std::ofstream destination("destination.txt", std::ios::binary);
  destination.write(&buffer[0], buffer.size());
  ticks2 = GetTickCount64();
  std::cout << "Finished saving (" << ticks2 - ticks1 << " ms)" << std::endl;
  return 0;
  }
0
zer0mail
2334 / 1960 / 192
Регистрация: 03.07.2012
Сообщений: 7,029
Записей в блоге: 1
08.06.2014, 15:50 #8
Нечего себе разница! Я собирал в VS 2010 на WindowsXP. Читает быстро, а пишет очень медленно (200Мб).
Пересобрал в Windows7 64 без отладки. Получилось 4Мб/сек. Конечно, лучше чем было, но до ~50Мб/сек далеко...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2014, 15:50
Привет! Вот еще темы с ответами:

5. Элементы заданного массива b(n) переписать в новый массив a(n) в обратном порядке - C++
5. Элементы заданного массива b(n) переписать в новый массив a(n) в обратном порядке.

Элементы заданного массива b(n) переписать в новый массив a(n) в обратном порядке. - C++
Помогите пожалуйста!! 2. Элементы заданного массива b(n) переписать в новый массив a(n) в обратном порядке.

Создать новый файл, каждая строка которого получается из строки исходного файла обратной перестановкой слов - C++
Всем привет!Помогите пожалуйста,на с++ с файлами еще не работал,вот и не понимаю,хоть убейте:D Дан текстовый файл.Создать новый...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.06.2014, 15:50
Ответ Создать тему
Опции темы

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