Студопедия

КАТЕГОРИИ:


Архитектура-(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 - в случае возникновения ошибки




Name_out - имя выходного файла.

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

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

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

Else

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

Max_dig - максимальное количество символов, которое занимает номер части.

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

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

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

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

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

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

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

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

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

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

*/

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, int max_dig)

{

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

int len;

if (pos!= NULL)

{

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

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

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

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

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

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

}

{

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

*ext = new char;

**ext = 0;

len = strlen(name) - max_dig - 1;

strncpy(*base_name, name, len);

(*base_name)[len] = 0;

}

}

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

/*

*/

int read_parts(char *name, UINT quantity, char *name_out)

{

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 = NULL;

UINT cur_number = 0;

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

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

FILE *f_out = fopen(name_out, "wbS"), *f = NULL;

if (f_out!= NULL)

{

get_name_parts(name, &base_name, &ext, max_dig);

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

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

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

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




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


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


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



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




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