ivan
Зарегистрирован: 01.03.2002 Сообщения: 19 Откуда: Moscow
|
Добавлено: Пн Дек 03 2001 11:06 Заголовок сообщения: Проблема прикопировании файла. |
|
|
Привет всем! Есть проблема. Сразу скажу, что копирование файла через поток выбрано из определённых соображений и использовать встроенные функции DOS по копированию файла не хотелось бы. Ниже преведён кусок кода программы по копированию файла. Основная проблема в том, что копия отличается от оригинала отсутствием символа конца файла (eof). Вместо этого в конце скопированного файла стоит символ "пробел". Где и что я не так делаю?
# include # include # include # include # include # include # include # define buff 16384 // Размер буфера ................................................................ char *buffer[buff]; ........................................................ hengl = open (newpath, O_BINARY); // Открытие файла в бинарном р-ме valfile = lseek (hengl, 0, SEEK_END); // Определение кол-ва байт в файле close (hengl);
if (valfile buff){ endfile = valfile; while (!feof(streamin)) { if (endfile buff) { fread(buffer, buff, 1, streamin); // Чтение байт в буфер fwrite(buffer, buff, 1, streamout); // Чтение байт из буфера /* Копирование файла происходит через поток данных. Функцией fread мы читаем в переменную buffer, которая на самом то деле указатель на массив размерностью buff, который связан с файлом из которого читаем данные в бинарном режиме. В книгах по оптимизации сказано, что размерность такого буфера должна быть кратной или равной кластеру жесткого диска, но в принципе, может быть любой. */ } else { fread(buffer, endfile, 1, streamin); fwrite(buffer, endfile, 1, streamout); i = i + endfile; /* Копирование потока данных в случае, когда объем оставшихся данных, подлежащих копированию, меньше размерности буфера. Если же продолжать копировать прежним размером буфера, то, в лучшем случае, мы увеличим размер файла на энное количество байт.*/ }
i = i + buff; endfile = valfile - i; /* Идёт вычисление местоположение указателя в файле*/ }
} else { fread(buffer, valfile, 1, streamin); fwrite(buffer, valfile, 1, streamout); /* Копирование файла, в случае, когда размер самого файла изначально меньше размера буфера.*/ }
Файл не копируется одним куском за раз исходя из соображений экономного расходования оперативной памяти. |
|
Ilia Гость
|
Добавлено: Ср Дек 05 2001 11:28 Заголовок сообщения: Попробуй так |
|
|
// Попробуй так когдато работало // обработку ошибок я убрал
const int bs = 16384; // Размер буфера int srcFHandle; // Файл источник int dstFHandle; // Файл приемник char buff[bs]; // Буфер перекачки int total; // Прочитано байт
srcFHandle = open("src.dat",O_BINARY); dstFHandle = open("dest.dat",O_CREAT | O_BINARY); while((total=read(srcFHandle,buff,bs))0) write(dstFHandle,buff,total); close(srcFHandle); close(dstFHandle); |
|
ivan
Зарегистрирован: 01.03.2002 Сообщения: 19 Откуда: Moscow
|
Добавлено: Чт Дек 06 2001 11:07 Заголовок сообщения: Решение проблемы |
|
|
Я принудительно затолкакл символ конца строки в последний байт файла. Конечно это не верно и не красиво, но работает. Вот кусок этого художества:
ch = 0x1a; fwrite (&ch, 1, 1, streamout); // 0x1a - шестнадцатиричный символ конца файла /* streamout - поток связанный со скопированным файлом. */ |
|