КАТЕГОРИИ: Архитектура-(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; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |