Д. Стефенс - C++. Сборник рецептов
- Название:C++. Сборник рецептов
- Автор:
- Жанр:
- Издательство:КУДИЦ-ПРЕСС
- Год:2007
- Город:Москва
- ISBN:5-91136-030-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Д. Стефенс - C++. Сборник рецептов краткое содержание
Данная книга написана экспертами по C++ и содержит готовые рецепты решения каждодневных задач для программистов на С++. Один из авторов является создателем библиотеки Boost Iostreams и нескольких других библиотек C++ с открытым исходным кодом. В книге затрагивается множество тем, вот лишь некоторые из них: работа с датой и временем; потоковый ввод/вывод; обработка исключений; работа с классами и объектами; сборка приложений; синтаксический анализ XML-документов; программирование математических задач. Читатель сможет использовать готовые решения, а сэкономленное время и усилия направить на решение конкретных задач.
C++. Сборник рецептов - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Функция complete
формирует абсолютный путь, используя текущий рабочий каталог и переданный ее относительный путь. Так, я могу следующим образом создать абсолютный путь к исходному файлу.
path src = complete(path("tmp\\foo.txt", native));
В том случае, если первый аргумент уже имеет абсолютное имя файла, функция complete
выдает заданное значение и не будет пытаться его присоединить к текущему рабочему каталогу. Другими словами, в следующем операторе, выполняемом при текущем каталоге « c:\myprograms
», последний будет проигнорирован, потому что уже задан полный путь.
path src = complete(path("c:\\windows\\garbage.txt", native));
Многие функции из библиотеки Boost Filesystem будут выбрасывать исключения, если не удовлетворяется некоторое предусловие. Это подробно описано в документации, но хорошим примером является сама функция copy_file
. Файл должен существовать перед копированием, поэтому если исходного файла нет, операция не будет завершена успешно и copy_file
выбросит исключение. Перехватите исключение, как я это сделал в примере 10.10, и вы получите сообщение об ошибке, объясняющее, что произошло.
10.8. Удаление или переименование файла
Требуется удалить или переименовать файл и сделать эту операцию переносимой, те. без использования специфичного для конкретной ОС программного интерфейса.
Это сделают стандартные C-функции remove
и rename
, определенные в . Пример 10.11 кратко демонстрирует, как это делается.
Пример 10.11. Удаление файла
#include
include
#include
using namespace std;
int main(int argc, char** argv) {
if (argc != 2) {
cerr << "You must supply a file name to remove." << endl;
return(EXIT_FAILURE);
}
if (remove(argv[1]) == -1) { // remove() возвращает при ошибке -1
cerr << "Error: " << strerror(errno) << endl;
return(EXIT_FAILURE);
} else {
cout << "File '" << argv[1] << "' removed." << endl;
}
}
Эти системные вызовы легко использовать: просто вызовите любую из двух функций, передав ей имя файла, который требуется удалить или переименовать. Если что-то не получится, будет возвращено ненулевое значение, и errno
будет иметь номер соответствующей ошибки. Вы можете использовать strerror
или perror
(обе функции определены в ) для вывода на печать сообщения об ошибке, зависящего от реализации.
Для переименования файла следует поменять в примере 10.11 вызов функции remove
следующим программным кодом.
if (rename(argv[1], argv[2])) {
cerr << "Error: " << strerror(errno) << endl;
return(EXIT_FAILURE);
}
Библиотека Boost Filesystem также предоставляет средства для удаления и переименования файла. В примере 10.12 показана короткая программа по удалению файла (или каталога, однако см. обсуждение, приводимое после этою примера).
Пример 10.12. Удаления файла средствами Boost
#include
#include
#include
#include
using namespace std;
using namespace boost::filesystem;
int main(int argc, char** argv) {
// Проверить параметры...
try {
path p = complete(path(argv[1], native));
remove(p);
} catch (exception& e) {
cerr << e.what() << endl;
}
return(EXIT_SUCCESS);
}
Важную часть примера 10.12 составляет функция remove
. При ее вызове следует задавать достоверный путь в аргументе path
, который ссылается на файл или пустой каталог, и они будут удалены. Пояснения по классу path
и функции complete
(оба они входят в библиотеку Boost Filesystem) приводятся при обсуждении рецепта 10.7. См. рецепт 10.11, где показан пример удаления каталога и всех содержащихся в нем файлов.
Переименование файла и каталога выполняется аналогично. Замените программный код в блоке try
примера 10.12 следующим кодом.
path src = complete(path(argv[1], native));
path dst = complete(path(argv[2], native));
rename(src, dst);
В результате src
будет переименован в dst
при условии, что оба они содержат достоверные пути, src
и dst
не обязаны иметь общий каталог, и в этом смысле функция переименования фактически перемещает файл или каталог в новый базовый каталог при условии, что путь dst
существует.
Рецепт 10.7.
10.9. Создание временного имени файла и временного файла
Требуется временно сохранить на диске некоторые данные, и вам не хочется писать самому программу, которая генерирует уникальные имена.
Используйте функцию tmpfile
или tmpnam
, которые объявлены в . tmpfile
возвращает FILE*
, который уже открыт на запись, a tmpnam
генерирует уникальное имя файла, которое вы можете сами открыть. Пример 10.13 показывает, как можно использовать функцию tmpfile
.
Пример 10.13. Создание временного файла
#include
#include
int main() {
FILE* pf = NULL;
char buf[256];
pf = tmpfile(); // Создать и открыть временный файл
if (pf) {
fputs("This is a temp file", pf); // Записать в него некоторые данные
}
fseek(pf, 5, SEEK_SET); // Восстановить позицию в файле
fgets(buf, 255, pf); // Считать оттуда строку
fclose(pf);
std:cout << buf << '\n';
}
Создать временный файл можно двумя способами; в примере 10.13 показан один из них. Функция tmpfile
объявляется в ; она не имеет параметров и возвращает FILE*
при успешном завершении и NULL
в противном случае. FILE*
— это тот же самый тип, который может использоваться функциями С, обеспечивающими ввод-вывод; fread
, fwrite
, fgets
, puts
и т.д. tmpfile
открывает временный файл в режиме «wb+» — это означает, что вы можете записывать в него или считывать его в двоичном режиме (т.е. при чтении символы никак специально не интерпретируются) После нормального завершения работы программы временный файл, созданный функцией tmpfile
, автоматически удаляется.
Такой подход может как подойти, так и не подойти для вас — все зависит от того, что вы хотите делать. Заметив, что tmpfile
не предоставляет имени файла, вы спросите, как можно передать его другой программе? В этом случае никак; вам потребуется вместо этой функции использовать аналогичную с именем tmpnam
.
tmpnam
на самом деле не создает временный файл, она просто создает уникальное имя файла, которое вы можете использовать при открытии файла, tmpnam
принимает единственный параметр типа char*
и возвращает значение типа char*
. Вы можете передать указатель на буфер символов char
(он должен быть, по крайней мере, не меньше значения макропеременной L_tmpnam
, также определенной в ), куда tmpnam
скопирует имя временного файла и возвратит указатель на тот же самый буфер. Если вы передадите NULL
, tmpfile
возвратит указатель на статический буфер, содержащий это имя файла, что означает его перезапись последующими вызовами tmpnam
. (См. пример 10.14.)
Интервал:
Закладка: