Учитель diego

Разделение файла

  • 10
  • Недоступна
Считать с консоли три имени файла: файл1, файл2, файл3. Разделить файл1 по следующему критерию: Первую половину байт записать в файл2, вторую половину байт записать в файл3. Если в файл1 количество байт нечетное, то файл2 должен содержать бОльшую часть. Закрыть потоки.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (171)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
LuneFox18 уровень, Москва
вчера, 13:45
Наверное, очень топорное решение с моей стороны, но я старался использовать минимум переменных. Выкладываю картинкой, чтобы нельзя было случайно подсмотреть или скопировать.
omat_kisat19 уровень, MIPS Assembly
понедельник, 14:29
Ну мне ничего умнее не пришло в голову кроме как создать еще два массива – для второго файла – длиной в полбуффера, а для первого – длиной в буффер минус второй (если длина буфера не делится на два без остатка, то целочисленное значение половины всегда будет меньшим куском). И с помощью System.arrayCopy запихать первую половину буфера в свой массив, а вторую – в свой, и уже из них-то записать в файлы. Чтение – один поток, писанина – в двух. Валидация с первой попытки.
VDT20 уровень, Екатеринбург
4 сентября, 10:34
"VDT пробует решить задачу Разделение файла с 10-й попытки...." Тупо не внимательность. Я ни как не мог понять, что ему надо, пока недопер, что большая часть данных должна быть ВО ВТОРОМ файле, а не в третьем
Dmitrii Sulimov24 уровень, Прага
29 августа, 20:59
3 попытки. Сначала забыл закрыть входной поток, потом выходной
28 августа, 10:35
Шикарная задачка, повезло сделать с первого раза. P.S я один через списки делал?
Ольга19 уровень, Москва
22 августа, 14:35
Задача просто вынос мозга, сидела наверное дня 4. Все чаще на ум приходила мысль о не едущих лыжах. Как только не пробовала решать, в итоге разделила массив на 3 варианта, и наконец, с 14 попытки (на самом деле их было наверное 40)
alezalez23 уровень, Одесса
13 августа, 07:39
Решил попробовать "разрезать" этой прогой видеофайл с расширением .mp4. Разрезало на два файла, только вот не хотят воспроизводиться :) Понятно, что нужно "резать" по ключевым кадрам :)
LuneFox18 уровень, Москва
вчера, 13:41
Ты не забывай, что файл .mp4 состоит не только из кадров, расположенных один за другим. Это контейнер, в котором где-то отдельно хранится звуковая дорожка, где-то видеодорожка, а также куча системной информации со свойствами файла. Разрезав файл пополам ты мог оставить часть системной информации только в одной половинке, или звук, или ещё чего - разумеется, что без полного комплекта твои половинки не заведутся.
alezalez23 уровень, Одесса
вчера, 14:25
Я не то, что не забываю, я более того знаю, как устроен сам кодек мп4 :) Просто было интересно, сможет ли система сама найти ключевой кадр, отбросив лишнее, чтобы уже с этого кадра отсчитывать дальше. Но нет, системе это не нравится. Это уже вопрос обработки видео самой системой. По сути, мп4 - это отдельные вагончики, которые заключают в себе инфу о ключевом кадре и изменениях в последующих, поэтому система должна по идее распознавать эти вагончики с содержимым, даже если один из них был разрезан пополам. Т.е. пропустить разрезанный и считывать целые.
LuneFox18 уровень, Москва
вчера, 14:59
Ну да, если будет нехватка информации где-то в дельте относительно ключевого кадра, то мы по идее просто получим испорченное изображение. Но если в этом месте у нас "разрез", то тут должно видео либо останавливаться, либо начинаться с этого момента (а точнее, скипаться до следующего ключевого кадра). А вообще, заголовок с информацией должен быть где-то в начале файла, т.е. в первой половинке, чтобы плеер распознал, что это корректный видеофайл. Вроде так. Не знаю правда, проверяются ли там какие-то контрольные суммы перед воспроизведением или нет... Не изучал этот вопрос.
Yerzhan20 уровень
18 июля, 18:59
Задачу решил сперва считыванием побайтно, валидатор отказывался принимать. Залез в комменты, оказывается считывать надо буфером. Переделал, валидатор согласился. Но теперь я сам задумался, а если файл большого размера, поискал в комментах, не нашел такого решения. Хотел сам сделать, третий способ уже получается, начал, но понял, что немного долго придется писать. А так было бы интересно, вводим размер буфера по желанию и затем считываем, необходимо учесть, что количество байтов растет, но не должно превысить половину первого файла, как превышение так должна пойти запись на третий файл. Также надо контролировать количество прочитанных байтов, так как считывание идет буфером, то может следующая запись может превысить половину. То есть, если размер файла 30, а буфер 8, то после 3 записи, надо будет уменьшить буфер до 6 или побайтно прочитать 6 байтов и дальше продолжить запись в третий файл. Решил пока отложить до лучших времен, а то и так застрял на задачах.
Alexey Matias20 уровень, Санкт-Петербург
22 июня, 18:54
Условия с большей и меньшей половинами решал с помощью count / 2 + 1 и count - (count / 2 + 1) соответственно. Валидатор принимать отказался Т_Т
Applejack20 уровень, Минск
14 августа, 19:23
Допустим, count=15. Тогда count/2 = (int) 7.5 = 7. То есть всегда наименьшее. Таким образом, не нужно добавлять единицу. Ее так же не следует добавлять потому, что если число будет четным count = 14, то 14/2+1=8, а нужно 7. Что делать? Правильно: count-count/2. В таком случае, если число нечетное, результатом будет большая половина, а если четное - просто половина. Поэтому валидатор и не принял решение.
darkSide23 уровень
22 августа, 15:21
Можно сделать if(count % 2 != 0) а дальше прибавить твоей новой переменной half +1; else просто делишь count и вуаля
Lena 18 уровень
19 июня, 16:40
6 попыток, а ключ оказался такой: в выражении file.write(buffer, 5, X) Х - это сколько байтов нужно считать после пятого байта (а не длина массива!). Надеюсь, кому-то поможет.