Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2008, 13:04   #1
c++ learner
Пользователь
 
Регистрация: 19.12.2008
Сообщений: 38
Вопрос как слить два файла?

Подскажите, пожалуйста как слить два файла?
Притом функция должна вернуть адрес(позицию начала добавляемого файла в объединенном)…
Вот что у меня получилось, но код мне не нравится (он пока сливает только маленькие файлы)… может, есть более гибкий/эффективный прием слияния файлов???

Код:
DWORD CAssembledResources::joinFile(	char* fileName) {
#ifdef DEBUG_AR_CLASS
	std::cout << "CAssembledResources::joinFile( " << fileName << " )" <<std::endl;
#endif /*DEBUG_AR_CLASS*/

	HANDLE fs2;
	fs2=CreateFile(fileName,
							GENERIC_READ,
							FILE_SHARE_READ,
							NULL,
							OPEN_EXISTING,
							FILE_FLAG_RANDOM_ACCESS,
							NULL );

	if (fs2) { //если файл открыт
		int f2s =	GetFileSize(fs2,NULL); //узнаем размер файла		
		DWORD nib =	GetFileSize(fs,NULL);
		DWORD dwBytesReads;
		char* lpBuffer = 0;
		const DWORD BlockSize = 128*1024;

		if (f2s>=(BlockSize)) { /*если придется копировать блок или несколько блоков по 128кб*/
			int f2bc = f2s/(BlockSize); /*посчитаем кол-во блоков*/
			int f2shank = (f2s % (BlockSize)); /*подсчитаем остаток*/
			
			lpBuffer=new char[BlockSize]; //block 128kb
			
			SetFilePointer( fs, 0 , NULL, FILE_END ); //goto to end of reslib
			
			//копируем блоки...
			for(int pass=0; pass<f2bc;pass++) {
			
				ReadFile(fs2,lpBuffer,BlockSize,&dwBytesReads,NULL);
				WriteFile(fs,lpBuffer,BlockSize,&dwBytesReads,NULL);
				
			}

			delete [] lpBuffer;
			//копируем остаток...
			if (f2shank) {
				lpBuffer=new char[f2shank];
				ReadFile(fs2,lpBuffer,(DWORD)f2shank,&dwBytesReads,NULL);
				WriteFile(fs,lpBuffer,(DWORD)f2shank,&dwBytesReads,NULL);
				delete [] lpBuffer;
			} 
			


		} else { /*если файл меньше 128кб*/
			lpBuffer=new char[f2s]; //выделим блок размером с файл(<128кб)

			ReadFile(fs2,lpBuffer,(DWORD)f2s,&dwBytesReads,NULL);
			SetFilePointer( fs, 0 , NULL, FILE_END ); //goto to end of reslib
			WriteFile(fs,lpBuffer,(DWORD)f2s,&dwBytesReads,NULL);

			delete [] lpBuffer;

		}
		
		CloseHandle(fs2);
		return (nib); 
	} else 
		return (0);
}
"...в самом начале было слово.." т.е. 16-битное битовое поле.
c++ learner вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнить два файла Aleksandr Microsoft Office Excel 6 07.10.2008 00:22
чтение из файла в два массива Frog25 Общие вопросы C/C++ 2 26.06.2008 12:15
Два XL файла, данные 1-го файла являются частью другого в формуле 2-го Кот Microsoft Office Excel 2 14.08.2007 16:56
два TMediaPlayer и два AVI-файла zeleniy Компоненты Delphi 0 01.06.2007 14:14
Как прочесть два массива из файла Need_Help Паскаль, Turbo Pascal, PascalABC.NET 5 20.05.2007 16:40