0

Здравствуйте меня интересует вопрос как я могу прочитать файл например zip архив в байтах и держать его в буфере для дальнейших действий. Как мне лучше это сделать?

Harry
  • 221,325
  • https://en.cppreference.com/w/cpp/io/ios_base/openmode – dIm0n Sep 07 '20 at 20:01
  • @dim0n Я использовал данный метод и у меня возникли проблемы, например я читаю файл ios::in | ios::binary и с помощью getline() читаю в string buff. Но когда я начинаю записывать файл он у меня поврежден что я сделал не так? – UserNameNickName Sep 07 '20 at 23:03
  • @UserNameNickName а не нужно читать с помощью getline. Читайте с помощью read, записывайте с помощью write – Croessmah stands with Russia Sep 08 '20 at 02:46

1 Answers1

4

Ну, если уж вы хотите читать файл в память полностью, то можно примерно так:

vector<char> readFile(const char* name)
{
    vector<char> buf;
    ifstream in(name,ios::binary);
    if (!in.is_open()) return buf;
    auto sz = in.seekg(0,ios::end).tellg();
    buf.resize(sz);
    in.seekg(0,ios::beg).read(buf.data(),sz);
    return buf;
}

int main(int argc, const char * argv[]) { vector<char> buf = readFile("data"); ofstream out("out",ios::binary); out.write(buf.data(),buf.size());

}

Неплохо дописать в функцию проверки корректности выполнения всех операций.
Сравните потом файлы data и out, должны быть одинаковы...

Harry
  • 221,325
  • Все супер. Но, мне кажется, что лучше переписать функцию readFile так, чтобы вектор символов передавался в нее по ссылке или указателю. А то как-то не по фэншую, имхо. – Majestio Sep 08 '20 at 05:36
  • @Majestio На вкус и цвет товарищей нет... Мне кажется логичнее мое решение :) – Harry Sep 08 '20 at 05:47
  • @ Harry, я это к Бритве Оккама))) Если можно без временных переменных обойтись, значит - нужно) – Majestio Sep 08 '20 at 05:51
  • @Majestio Моя логика - нет смысла готовить vector<char> заранее, если он той же ценой (без лишних копирований etc) будет создан в самой функции. vector<char> f; readFile("data",f); мне нравится меньше, чем auto f = readFile("data"); – Harry Sep 08 '20 at 06:22
  • Я не возражаю против минусов. Я только решительно настаиваю не прятаться трусливо за анонимностью, а пояснять, почему минус. "Дабы дурость каждого видна была" (с) приписывается Петру I – Harry Sep 08 '20 at 08:29
  • Тут это обычное дело, расслабься ... Щя нейтрализуем анонимуса ) – Majestio Sep 08 '20 at 09:11
  • @Harry на всех последних ответах с const char * argv[] мои минусы. Вы сказали, что не хотите со мной общаться, поэтому я и не озвучиваю это под каждым ответом. Все ответы отслеживаются, и после исправления ошибок минусы будут сняты – dIm0n Sep 08 '20 at 09:13
  • @ dIm0n, типа нужно char * const argv[]? (https://www.opennet.ru/cgi-bin/opennet/man.cgi?topic=execv) – Majestio Sep 08 '20 at 10:24
  • @Majestio либо без параметров, либо с параметрами, эквивалентными int и char*[] – dIm0n Sep 08 '20 at 14:40
  • А откуда это утверждение? – Majestio Sep 08 '20 at 20:26
  • @Majestio из стандарта языка и любых доков. Например, отсюда https://en.cppreference.com/w/cpp/language/main_function – dIm0n Sep 08 '20 at 20:28
  • Этот "референс" - не стандарт, это его компиляция. А вот в стандарте (я смотрел N4659 - это черновик C++17) в п.6.6.1 четкого требования нет. Есть "An implementation shall allow both (2.1) — a function of () returning int and (2.2) — a function of (int, pointer to pointer to char) returning int". Хорошо, мы не поставим const ... в надежде на будущее изменять argv? – Majestio Sep 08 '20 at 20:41
  • @Majestio ну вы же сами написали pointer to pointer to char, а здесь в ответе const char*[]. Это разные типы. Т.е. такая форма implementation defined => непортабельна. Вообще, уже 3 раз это объясняю, тут обсуждение в комментариях было сегодня. Предлагаю продолжить в том чате, если остались вопросы, а не засорять тут комментарии/уведомления участнику – dIm0n Sep 08 '20 at 20:44
  • Чтоб закрыть этот вопрос - Страуструп написал примерно так - что он согласен с моим мнением (что безопаснее писать const char*), и что char* - проблема исторического свойства (*I agree, but it is hard to mess with the ancient past - you don't know who you might hurt. I *think* I tried this and failed almost 40 years ago.). Поскольку формально я получил разрешение делать так, если мой компилятор это позволяет (You might simply accept both*), так что, признавая стандарт, я из принципа оставляю все как есть, пока мне не покажут хоть один компилятор, который это не примет :) – Harry Sep 09 '20 at 04:02