Д. Стефенс - C++. Сборник рецептов

Тут можно читать онлайн Д. Стефенс - C++. Сборник рецептов - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство КУДИЦ-ПРЕСС, год 2007. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    C++. Сборник рецептов
  • Автор:
  • Жанр:
  • Издательство:
    КУДИЦ-ПРЕСС
  • Год:
    2007
  • Город:
    Москва
  • ISBN:
    5-91136-030-6
  • Рейтинг:
    3.9/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Д. Стефенс - C++. Сборник рецептов краткое содержание

C++. Сборник рецептов - описание и краткое содержание, автор Д. Стефенс, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Данная книга написана экспертами по C++ и содержит готовые рецепты решения каждодневных задач для программистов на С++. Один из авторов является создателем библиотеки Boost Iostreams и нескольких других библиотек C++ с открытым исходным кодом. В книге затрагивается множество тем, вот лишь некоторые из них: работа с датой и временем; потоковый ввод/вывод; обработка исключений; работа с классами и объектами; сборка приложений; синтаксический анализ XML-документов; программирование математических задач. Читатель сможет использовать готовые решения, а сэкономленное время и усилия направить на решение конкретных задач.

C++. Сборник рецептов - читать онлайн бесплатно полную версию (весь текст целиком)

C++. Сборник рецептов - читать книгу онлайн бесплатно, автор Д. Стефенс
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Пример 10.14. Создание имени временного файла

#include

#include

#include

#include

int main() {

char* pFileName = NULL;

pFileName = tmpnam(NULL);

// Здесь другая программа может получить то же самое имя временного

// файла.

if (!pFileName) {

std::cerr << "Couldn't create temp file name.\n";

return(EXIT_FAILURE);

}

std::cout << "The temp file name is: " << pFileName << '\n';

std::ofstream of(pFileName);

if (of) {

of << "Here is some temp data.";

of.close();

}

std::ifstream ifs(pFileName);

std::string s;

if (ifs) {

ifs >> s;

std::cout << "Just read in \"" << s << "\"\n";

ifs.close();

}

}

Однако одну важную особенность необходимо знать о функции tmpnam. Может возникнуть условие состязания, когда несколько процессов могут генерировать одинаковое имя файла, если один процесс вызывает tmpname, а другой вызывает tmpnameдо того, как первый процесс откроет этот файл. Это плохо по двум причинам. Во-первых, написанная злоумышленником программа может делать это для перехвата данных временного файла, и, во-вторых, ни о чем не подозревающая программа может получить то же самое имя файла и просто испортить или удалить данные.

10.10. Создание каталога

Проблема

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

Решение

На большинстве платформ вы сможете использовать системный вызов mkdir, который входит в состав большинства компиляторов и содержится в заголовочных файлах C-функций. Он имеет разный вид в различных ОС, но тем не менее вы можете его использовать для создания нового каталога. Стандартными средствами C++ нельзя обеспечить переносимый способ создания каталога. В этом вы можете убедиться на примере 10.15.

Пример 10.15. Создание каталога

#include

#include

int main(int argc, char** argv) {

if (argc < 2) {

std::cerr << "Usage: " << argv[0] << " [new dir name]\n";

return(EXIT_FAILURE);

}

if (mkdir(argv[1]) == -1) { // Созвать каталог

std::cerr << "Error: " << strerror(errno);

return(EXIT_FAILURE);

}

}

Обсуждение

Системные вызовы по созданию каталогов слегка отличаются в различных ОС, но пусть это вас не останавливает — их все же следует использовать. В большинстве систем поддерживаются различные варианты вызова mkdir, поэтому для создания каталога достаточно просто знать, какой включать заголовочный файл и как выглядит сигнатура функции.

Пример 10.15 работает в системах Windows, но не в Unix. В Windows mkdirобъявляется в . Эта функция принимает один параметр (имя каталога) и возвращает -1, если возникла ошибка, устанавливая в errno соответствующий номер ошибки. Вы можете получить зависящую от реализации текстовую строку ошибки, вызывая strerror или perror.

В Unix mkdirобъявляется в , и сигнатура этой функции немного отличается. Семантика ошибки такая же, как в Windows, но существует второй параметр, определяющий права доступа нового каталога. Вы должны указать права доступа, используя традиционный формат chmod(см. дополнительную информацию на man-странице chmod); например, 0777 означает, что владелец, групповой пользователь и прочие пользователи имеют право на чтение, запись и выполнение. Таким образом, вы могли бы вызвать эту функцию следующим образом.

#include

#include

#include

int main(int argc, char** argv) {

if (argc < 2) {

std::cerr << "Usage: " << argv[0] << " [new dir name]\n";

return(EXIT_FAILURE);

}

if (mkdir(argv[1], 0777) == -1) { // Создать каталог

std::cerr << "Error: << strerror(errno);

return(EXIT_FAILURE);

}

}

Если вам требуется обеспечить переносимость, не следует самому писать операторы #ifdef, лучше воспользоваться библиотекой Boost Filesystem. Вы можете создать каталог, используя функцию сreate_directory, как показано в примере 10.16, который содержит короткую программу, создающую каталог.

Пример 10.16. Создание каталога средствами Boost

#include

#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));

create_directory(p);

} catch (exception& e) {

cerr << e.what() << endl;

}

return(EXIT_SUCCESS);

}

Функция create_directoryсоздает каталог, имя которого вы задаете в аргументе path. Если этот каталог уже существует, выбрасывается исключение filesystem_error(которое является производным от стандартного класса исключения). Пояснения по классу pathи функции complete(оба они входят в библиотеку Boost Filesystem) приводятся в обсуждении рецепта 10.7. См. рецепт 10.11, где показан пример удаления каталога и всех содержащихся в нем файлов. С другой стороны, если переносимость вас не волнует, используйте программный интерфейс файловой системы вашей ОС, который, вероятно, обладает большей гибкостью.

Смотри также

Рецепт 10.12.

10.11. Удаление каталога

Проблема

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

Решение

На большинстве платформ вы сможете воспользоваться системным вызовом rmdir, который входит в состав большинства компиляторов и содержится в заголовочных файлах C-функций. Стандартными средствами C++ нельзя обеспечить переносимый способ удаления каталога. Вызов rmdirимеет разный вид в различных ОС, но тем не менее вы можете его использовать для удаления каталога. См. Пример 10.17, в котором приводится короткая программа по удалению каталога.

Пример 10.17. Удаление каталога

#include

#include

using namespace std;

int main(int argc, char** argv) {

if (argc < 2) {

cerr << "Usage: " << argv[0] << " [dir name]" << endl;

return(EXIT_FAILURE);

}

if (rmdir(argv[1]) == -1) { // Удалить каталог

cerr << "Error: " << strerror(errno) << endl;

return(EXIT_FAILURE);

}

}

Обсуждение

Сигнатура rmdirсовпадает в большинстве ОС, однако объявляется эта функция в разных заголовочных файлах. В Windows она объявляется в , а в Unix — в . Она принимает один параметр (имя каталога) и возвращает -1, если возникла ошибка, устанавливая в errnoсоответствующий номер ошибки. Вы можете получить зависящую от реализации текстовую строку ошибки, вызывая strerrorили perror.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Д. Стефенс читать все книги автора по порядку

Д. Стефенс - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




C++. Сборник рецептов отзывы


Отзывы читателей о книге C++. Сборник рецептов, автор: Д. Стефенс. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x