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