0

Написал одну и ту же программу на python и c++, чтение и запись файла

На python читаю файл через .read() записываю .write()

На c++ использую ifstream fin; и ofstream fout;

ofstream fout;
ifstream fin;

fin.open("Path"); fout.open("Path", ofstream::app);

string str; while (!fin.eof()) { fin >> str; fout << str << "\n"; }

Читаю файл построчно, подскажите как можно реализовать считывание сразу всего файла txt размером 100мб на c++, что бы я мог сразу записать содержимое в другой файл

Harry
  • 221,325
Robot
  • 355

1 Answers1

5

Зачем именно все сразу в память? Все 100 МБайт?

Впрочем, дело ваше, как хотите.

Вот, без проверок для иллюстрации принципа:

ifstream in ("orig",ios::binary);
ofstream out("dest",ios::binary);

in.seekg(0,ios::end); size_t sz = in.tellg(); char * buf = new char[sz]; in.seekg(0); in.read(buf,sz); out.write(buf,sz); delete[] buf;

Но желательно все же проверки выполнять. Надежнее как-то :)

Update

Замеры скорости копирования на моей машине дают следующий результат для файла размером в 775 МБайт:

введите сюда описание изображения

Как видите, монстрообразный буфер — это таки плохо. Можете выполнить замеры на своей машине (а главное, на своем винте :)) и найти, когда неприятности начинаются у вас...

Update

Код для копирования с конкретным размером буфера bufsize.

const int bufsize = 8192;
ifstream in ("orig",ios::binary);
ofstream out("dest",ios::binary);
char * buf = new char[bufsize];
unsigned int rd;
do {
    rd = in.read(buf,bufsize).gcount();
    out.write(buf,rd);
} while(rd == bufsize);
delete[] buf;
Harry
  • 221,325
  • не спорю, с проверками лучше, просто на python эта задачы (чтение / запись) выполняется за 2-3 секунды, а на c++ при построчном чтении 16-17 секунд, я не знаю как именно происходит чтение файла в python (предполагаю что питон просто копирует содержимое файла в другой файл и все) по этому я думаю что если читать все 100мб текста сразу и их записывать, то процесс будет быстрее, если есть способ быстрого чтения и записи текста в c++ то подскажите его, я буду вам очень благодарен за любую информацию. – Robot Jul 29 '22 at 10:29
  • @Robot На питоне вы читаете сразу весь файл и пишете сразу весь файл, естественно это будет быстрее, чем делать тоже самое построчно. Особенно если в питоне вы читаете и пишете в двоичном режиме. – CrazyElf Jul 29 '22 at 10:33
  • Поблочно, но просто 100 Мбайт сразу в памяти занимать смысла особого нет. Можно обойтись какими-то более реального размера блоками; можно даже поэкспериментировать, при каком размере блока все будет достаточно быстро — поискать компромисс между используемой памятью и скоростью... – Harry Jul 29 '22 at 11:06
  • Насчет скорости — см. дополненный ответ. – Harry Jul 29 '22 at 11:45
  • @Harry, спасибо за ваш полный ответ, я воспользовался тем кодом что вы указали, и скорость на с++ стала 40 сек для 2.25 Гб файлов, тогда как на python скорость 1 мин 12 сек, для тех же 2.25 Гб – Robot Jul 29 '22 at 11:51
  • А если тот код, что я добавил — для 8 КБайт? Тогда сколько времени? А для 8 МБайт? – Harry Jul 29 '22 at 14:59
  • @Harry, вы наверное в windows замеряли? Впрочем, насколько я помню свои эксперименты в linux и паре разных unix-ов, картина та же. После 128K лучше уже не становится – avp Jul 29 '22 at 19:13
  • @avp Да, Windows. Но мне кажется, что тут дело скорее с железом связано, чем с ОС. – Harry Jul 30 '22 at 04:32