Форум: Форум C++Разное
Новые темы: 00
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Символ конца файла
 
 автор: DDK   (04.03.2007 в 23:57)   письмо автору
 
 

Подскажите символ конца файла пожалуйста ! Проблема в том, что при копировании файла в двоичном режиме по 128 байт за цикл (цикл условлен .eof() ) файл копируется нормально, но в конец дописываются почему-то 12 лишних нулевых байта (файл весит больше 50мб). Хоть они и нулевые, но это файл прошивки для коммуникатора, так что точность нужна 100%-я. Так вот хочу после прохода цикла сделать seekp(length, ios_base::beg) и записать тупо символ конца файла (length исходного файла перед копированием определяется правильно). ЗЫ: Идти шагом по 1 байту вместо 128 не выход, ибо 55мб таким образом копируются почти минуту.

  Ответить  
 
 автор: oleg_alexeev   (05.03.2007 в 08:25)   письмо автору
 
   для: DDK   (04.03.2007 в 23:57)
 

>> ..хочу после прохода цикла сделать seekp(length, ios_base::beg) и записать тупо символ конца файла

Вряд-ли это будет правильно. Приведите текст функции копирования, найдем ошибку.

Если программа под Windows, то рекомендую воспользоваться CopyFile или CopyFileEx -
работать будет максимально быстро.

  Ответить  
 
 автор: DDK   (05.03.2007 в 08:42)   письмо автору
 
   для: oleg_alexeev   (05.03.2007 в 08:25)
 


        fstream inputromfile(filepath.c_str(), ios::in|ios::binary);

        SetCurrentDirectory(RTC.defworkdir.c_str());
        fstream tempromfile("temp.rom", ios::out|ios::in|ios::binary|ios::trunc);
        SetFileAttributes("temp.rom", FILE_ATTRIBUTE_HIDDEN);

        int i = 0, length, pbarstep;
        char * buffer = new char[128];
        inputromfile.seekg(0, ios_base::end);
        length = inputromfile.tellg();
        inputromfile.seekg(0, ios_base::beg);

        pbarstep = length / 128 / 100;
        MainForm->ProgressBar1->Visible = true;
        while(!inputromfile.eof()) {
                if(i%pbarstep == 0)
                {
                        MainForm->ProgressBar1->Position += 1;
                }
                inputromfile.read(buffer, 128);
                tempromfile.write(buffer, 128);
                i+=128;
        }

        inputromfile.close();
        tempromfile.close();


Как видно, копирование завязано с прогрессбаром... а у функции CopyFile нет Callback-части случайно на этот случай ?

  Ответить  
 
 автор: DDK   (05.03.2007 в 08:48)   письмо автору
 
   для: DDK   (05.03.2007 в 08:42)
 

А, всё, сапасибо, нашел :) http://vsokovikov.narod.ru/Msdn_api/Global_SDK/Reference_API/Functions/Fn_C/fn_copyfileex.htm

Но всё же интересно, в чем ошибка моего кода ?

  Ответить  
 
 автор: oleg_alexeev   (05.03.2007 в 08:52)   письмо автору
 
   для: DDK   (05.03.2007 в 08:42)
 

У CopyFileEx есть callback и возможность прервать копирование.

А ошибка очевидна - вы пишете в выходной файл всегда 128 байт, а надо писать столько, сколько
прочиталось функцией read. Это число возвращается методом gcount.


tempromfile.write(buffer, inputromfile.gcount());

  Ответить  
 
 автор: DDK   (05.03.2007 в 13:15)   письмо автору
 
   для: oleg_alexeev   (05.03.2007 в 08:52)
 

Привычки простоты PHP :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования