Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Функция возвращает 0, в случае удачного выполнения, -1 - в случае возникновения ошибки




Quantity - количество фрагментов.

Name - имя исходного файла.

Количество выходных файлов.

Эта функция разбивает исходный файл на фрагменты и записывает его в указанное

Else

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

Ext - двойной указатель на расширение исходного файла.

Base_name - двойной указатель на часть имени файла (не включая расширение).

Name - указатель на имя исходного файла.

Эта функция получает фрагменты имени исходного файла.

Quantity - количество фрагментов

Эта функция подсчитывает максимальное количество символов, необходимое для хранения номера фрагмента.

Функция возвращает указатель на полученное имя.

Cur_number - номер текущего фрагмента.

Format_str - указатель на форматную строку для функции sprintf.

Num_part - указатель на буфер для преобразования числа в строку.

Ext - расширение

Base_name - часть имени исходного файла, которое не включает расширение.

New_name - указатель на новое имя с учетом расширения.

Номера обрабатываемого фрагмента.

Эта функция генерирует очередное имя файла путем добавления к базовому имени

*/

inline char *get_cur_name(char *new_name, char *base_name, char *ext, char *num_part, char *format_str, int cur_number)

{

sprintf(num_part, format_str, cur_number);

return strcat(strcat(strcpy(new_name, base_name), num_part), ext);

}

//-------------------------------------------------

/*

*/

int get_max_num_digits(UINT quantity)

{

for (int num = 0; quantity > 0; quantity /= 10, num++);

return num;

}

//-------------------------------------------------

/*

При работе с двойными указателями для записи/получения адреса используется одиночное разименование, для записи значения по полученному адресу - двойное разименование

*/

void get_name_parts(char *name, char **base_name, char **ext)

{

char *pos = strrchr(name, '.');

int len;

if (pos!= NULL)

{

*base_name = new char [len = pos - name + 1];

strncpy(*base_name, name, len - 1);

// Ручное добавление символа с кодом 0 в конец строки

(*base_name)[len - 1] = 0;

*ext = new char [strlen(name) - len + 2];

strcpy(*ext, name + len - 1);

}

{

*base_name = new char [strlen(name) + 1];

*ext = new char;

**ext = 0;

strcpy(*base_name, name);

}

}

//-------------------------------------------------

/*

*/

int write_parts(char *name, UINT quantity)

{

int max_dig = get_max_num_digits(quantity), part_size, cnt_read;

char *base_name, *ext, *new_name = new char [strlen(name) + max_dig + 1];

char *format_str = new char [max_dig + 4], *num_part = new char [max_dig + 1], *buf;

UINT cur_number = 0;

// Важным является использование режима _O_BINARY как для входного, так и

// для выходных файлов

int fd = _open(name, _O_RDONLY | _O_BINARY | _O_SEQUENTIAL), fd_out = -1;

if (fd!= -1)

{

get_name_parts(name, &base_name, &ext);

// Определяем размер каждого фрагмента, кроме последнего

part_size = filelength(fd) / quantity;

// Формируем строку форматного вывода для получения имени файла для

// записи текущего фрагмента

// %% означает вывод символа %

sprintf(format_str, "%%0%ii", max_dig);

// Выделяем память под буфер для ввода / вывода

buf = new char [part_size];




Поделиться с друзьями:


Дата добавления: 2017-01-14; Просмотров: 733; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.