Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Проблема прикопировании файла.

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
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
Гость





СообщениеДобавлено: Пн Дек 03 2001 17:22    Заголовок сообщения: Проблемма в определении типов Ответить с цитатой

char *buffer[buff];

Ты определил указатель на массив указателей
на char те. вместо char* у тебя char**.
Я думаю все проблеммы отсюда.
С уважением.
Вернуться к началу
ivan



Зарегистрирован: 01.03.2002
Сообщения: 19
Откуда: Moscow

СообщениеДобавлено: Вт Дек 04 2001 18:16    Заголовок сообщения: Нет дело не в этом. Ответить с цитатой

Попробовал по вашему совету. Та же песня. Общий объем файла-копии совпадает с файлом оригиналом, а различие только в последнем символе. EOF заменяется на пробел. В шестнадцатиричных кодах это выглядит как замена символа "1А" на символ "20".
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
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 - поток связанный со скопированным файлом. */
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Ilia
Гость





СообщениеДобавлено: Чт Дек 06 2001 13:43    Заголовок сообщения: Re: Решение проблемы Ответить с цитатой

Не оставляй это в таком виде можеш наткнуться на трудно определяемые побочные эффекты.
Удачи.
Вернуться к началу
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...