Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Копирование файла с определённого байта / 6 сообщений из 6, страница 1 из 1
09.04.2016, 20:22
    #39211728
ukugyul552465
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла с определённого байта
Вот так копируем весь файл:
Код: plaintext
1.
2.
3.
4.
5.
std::ifstream in ("1.txt");
 std::ofstream out("2.txt");
 out << in.rdbuf();
 out.close();
 in.close();


А как начать копирование с 3500 байта, например.
Может быть, чтото с использованием SEEK_SET?
...
Рейтинг: 0 / 0
09.04.2016, 22:49
    #39211776
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла с определённого байта
ukugyul552465,

Код: plaintext
1.
2.
3.
4.
5.
6.
in.seekg(10); // стартовая позиция
std::copy_n(
    std::istreambuf_iterator<char>(in), 
    10,       // количество
    std::ostreambuf_iterator<char>(out)
);
...
Рейтинг: 0 / 0
09.04.2016, 22:53
    #39211777
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла с определённого байта
Код: plaintext
1.
2.
3.
4.
5.
6.
in.seekg(10); // стартовая позиция
std::copy(    // и копировать до конца файла
    std::istreambuf_iterator<char>(in), 
    std::istreambuf_iterator<char>(),
    std::ostreambuf_iterator<char>(out)
);
...
Рейтинг: 0 / 0
10.04.2016, 18:54
    #39211990
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла с определённого байта
ukugyul552465А как начать копирование с 3500 байта, например.
Может быть, чтото с использованием SEEK_SET?Да:
Код: plaintext
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.
31.
32.
33.
#include <assert.h>
#include <stdio.h>
#include <algorithm>

int file_size(FILE* file) {
  assert(ftell(file) == 0); // вызывать надо сразу после открытия файла
  fseek(file, 0, SEEK_END); // ставим position в конец файла
  int size = ftell(file); // получаем position
  fseek(file, 0, SEEK_SET); // ставим position обратно в начало файла
  return size;
}

void partially_copy_file(const char source_path[], const char dest_path[], int start_pos) {
  assert(start_pos >= 0);
  FILE* sf = fopen(source_path, "rb");
  FILE* df = fopen(dest_path, "wb");
  int size = file_size(sf);
  if (size > start_pos) {
    const int buf_size = 4 * 1024;
    unsigned char buf[buf_size];
    // копируем файл кусками
    int pos = start_pos;
    fseek(sf, start_pos, SEEK_SET); // ставим position в start_pos
    while (pos < size) {
      int n = std::min(buf_size, size - pos);
      fread(buf, 1, n, sf);
      fwrite(buf, 1, n, df);
      pos += n;
    }
  }
  fclose(sf);
  fclose(df);
}

Обработки ошибок нет, чтобы код был проще. А iostreams я не люблю. Она переусложнённая , неудобная, и обычно тормозная (по сравнению с stdio).
...
Рейтинг: 0 / 0
10.04.2016, 19:03
    #39211992
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла с определённого байта
Пётр Седовiostreams я не люблю. Она переусложнённая , неудобная, и обычно тормозная (по сравнению с stdio).
В виндовсе тормозная, в линуксе наоборот 18905559
...
Рейтинг: 0 / 0
13.04.2016, 15:44
    #39214777
ukugyul552465
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла с определённого байта
Всем спасибо, всё получилось.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Копирование файла с определённого байта / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]