Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Побайтное копирование файла 
:(
    Опции темы
SiNn3R
Дата 18.5.2011, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 12.12.2010

Репутация: нет
Всего: нет



Здравствуйте, есть код:

Код

//открытие файлов
FILE *file_i = fopen(filename_i, "rb");
FILE *file_o = fopen(filename_o, "wb");

char value;
for(unsigned long i = 0;; ++i)
{
   //чтение байта
   fread(&value, 1, 1, file_i);
   if(feof(file_i) != 0) break;

    //запись байта
   fwrite(&value, 1, 1, file_o);
}

//закрытие файлов
fclose(file_i);
fclose(file_o);


Т.е. открывается один файл и копируется в другой. Как я понял, тут ошибка с вызовом функции feof() - на ней крашилось, когда я открывал файл 5mb... Как правильно проверять файл на конечность при побайтовом чтении (rb, wb)?

Думал проверять, что возвращает функция fread, но она всегда почему-то возвращает 0... (С именем файла не ошибся точно!)

Это сообщение отредактировал(а) SiNn3R - 18.5.2011, 00:20
PM MAIL   Вверх
triclosan
Дата 18.5.2011, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 2
Всего: 12



5MB?

sizeof(unsigned long) ?
PM MAIL   Вверх
volatile
Дата 18.5.2011, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



SiNn3R,
У вас всё вроде правильно. Жутко тормознуто правда, но правильно. Должно копировать.
Скорей всего ошибка в путях при открытии.
Добавьте проверку:
Код

   FILE *file_i = fopen(filename_i, "rb");
   if (!file_i)
   {
      printf("cannot open input file!\n");
      return;
   }
   FILE *file_o = fopen(filename_o, "wb");
   if (!file_o)
   {
      printf("cannot open output file!\n");
      return;
   }

и сообщите результаты.

PM MAIL   Вверх
borisbn
Дата 18.5.2011, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



SiNn3R, у Вас прочитается но не запишется последний байт из вх.файла.
И ещё: обычно (это не догма - просто обычно) делают так
Код

while ( !feof(file_i) ) {
    fread( ... file_i );
    fwrite( ... file_o );
}

Да, и ещё (а это уже догма) - проверять, что файлы открыты, нужно всегда, как Вам и показал volatile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
SiNn3R
Дата 18.5.2011, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 12.12.2010

Репутация: нет
Всего: нет



Файлы открыты, проверял. Попробую ещё через while переписать...

Добавлено через 5 минут и 57 секунд
Всё, разобраялся... Тупанул, в имени файла было слово "- копия". Ох уж эти русские символы...
PM MAIL   Вверх
borisbn
Дата 18.5.2011, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(SiNn3R @  18.5.2011,  00:18 Найти цитируемый пост)
Думал проверять, что возвращает функция fread, но она всегда почему-то возвращает 0

а вот это вообще непонятно, т.к. 
Цитата

Return Value

The total number of elements successfully read is returned as a size_t object, which is an integral data type.
 If this number differs from the count parameter, either an error occured or the End Of File was reached.
 You can use either ferror or feof to check whether an error happened or the End-of-File was reached.

кстати, попробуй посмотреть, что даёт ferror, если fread вернула 0


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 18.5.2011, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Значит не проверял!
Цитата(SiNn3R @  18.5.2011,  01:35 Найти цитируемый пост)
Файлы открыты, проверял.
Цитата(SiNn3R @  18.5.2011,  01:35 Найти цитируемый пост)
Тупанул, в имени файла было слово "- копия". Ох уж эти русские символы... 



Цитата(borisbn @  18.5.2011,  01:16 Найти цитируемый пост)
не запишется последний байт из вх.файла.

borisbn, имхо, должно все записаться. smile 
PM MAIL   Вверх
borisbn
Дата 18.5.2011, 02:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(volatile @  18.5.2011,  02:09 Найти цитируемый пост)
borisbn, имхо, должно все записаться.

аааа. да. забыл, что feof не говорит о конце файла при прочтении последнего байта, а сообщает об этом только если была попытка прочитать что-то после последнего байта. IMHO не совсем логично сделали. Просто это нужно помнить.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0785 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.