Здравствуйте меня интересует вопрос как я могу прочитать файл например zip архив в байтах и держать его в буфере для дальнейших действий. Как мне лучше это сделать?
Asked
Active
Viewed 346 times
0
-
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 Answers
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
-
-
@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 из стандарта языка и любых доков. Например, отсюда 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