Строки и потоки

Глава 6. Стандартная библиотека #

6.3 Строки и потоки #

1. Класс string #

1.1 Основы работы с классом string #

Класс string из стандартной библиотеки C++ предоставляет мощный и удобный способ работы со строками, избавляя от низкоуровневых操раций с символьными массивами.

#include <string>
#include <iostream>

int main() {
    // Создание строк различными способами
    std::string str1 = "Привет, мир!";           // Инициализация строки
    std::string str2("Другая строка");           // Конструктор с параметром
    std::string str3(5, 'A');                    // Строка из 5 символов 'A'

    // Основные операции
    std::cout << str1.length() << std::endl;     // Длина строки
    std::cout << str1 + " " + str2 << std::endl; // Конкатенация
    
    // Доступ к символам
    char ch = str1[2];                           // Доступ по индексу
    
    // Изменение строки
    str1.append(" Дополнительный текст");        // Добавление в конец
    str1.insert(0, "Начало: ");                  // Вставка в начало
    str1.erase(5, 3);                            // Удаление подстроки
}

1.2 Методы класса string #

Класс string предоставляет множество полезных методов:

  • find(): Поиск подстроки
  • substr(): Извлечение подстроки
  • compare(): Сравнение строк
  • empty(): Проверка на пустоту
std::string text = "Пример строки для демонстрации";
size_t pos = text.find("строки");               // Найти позицию подстроки
std::string sub = text.substr(7, 6);             // Извлечь подстроку
int result = text.compare("Другая строка");      // Сравнить строки
bool isEmpty = text.empty();                     // Проверить на пустоту

2. Работа с потоками ввода-вывода #

2.1 Базовые потоки #

C++ предлагает три основных потока для ввода-вывода:

  • cin: Стандартный поток ввода
  • cout: Стандартный поток вывода
  • cerr: Поток вывода ошибок
#include <iostream>
#include <string>

int main() {
    // Ввод с клавиатуры
    std::string name;
    int age;
    
    std::cout << "Введите имя: ";
    std::cin >> name;
    
    std::cout << "Введите возраст: ";
    std::cin >> age;
    
    // Вывод данных
    std::cout << "Имя: " << name << ", Возраст: " << age << std::endl;
    
    // Вывод ошибки
    std::cerr << "Пример сообщения об ошибке" << std::endl;
}

2.2 Манипуляторы потоков #

Манипуляторы позволяют форматировать вывод:

#include <iostream>
#include <iomanip>

int main() {
    double pi = 3.14159265359;
    
    // Форматирование вывода
    std::cout << std::fixed;                     // Фиксированная точность
    std::cout << std::setprecision(2);           // 2 знака после запятой
    std::cout << pi << std::endl;                // Выведет 3.14
    
    // Установка ширины и выравнивания
    std::cout << std::setw(10);                  // Ширина поля 10 символов
    std::cout << std::right;                     // Выравнивание вправо
    std::cout << 42 << std::endl;
}

3. Форматированный ввод-вывод #

3.1 Чтение и запись структурированных данных #

#include <iostream>
#include <sstream>
#include <string>

struct Person {
    std::string name;
    int age;
};

int main() {
    // Преобразование строки в поток
    std::string input = "Иван 25";
    std::istringstream iss(input);
    
    Person person;
    iss >> person.name >> person.age;
    
    // Преобразование потока в строку
    std::ostringstream oss;
    oss << "Имя: " << person.name << ", Возраст: " << person.age;
    std::string output = oss.str();
    
    std::cout << output << std::endl;
}

4. Работа с файлами #

4.1 Основы файлового ввода-вывода #

#include <fstream>
#include <string>
#include <iostream>

int main() {
    // Запись в файл
    std::ofstream outFile("example.txt");
    if (outFile.is_open()) {
        outFile << "Привет, файл!" << std::endl;
        outFile.close();
    }
    
    // Чтение из файла
    std::ifstream inFile("example.txt");
    if (inFile.is_open()) {
        std::string line;
        while (std::getline(inFile, line)) {
            std::cout << line << std::endl;
        }
        inFile.close();
    }
    
    // Добавление в файл
    std::ofstream appendFile("example.txt", std::ios::app);
    if (appendFile.is_open()) {
        appendFile << "Новая строка" << std::endl;
        appendFile.close();
    }
}

4.2 Режимы открытия файлов #

Основные режимы открытия файлов:

  • std::ios::in: Открытие для чтения
  • std::ios::out: Открытие для записи
  • std::ios::app: Добавление в конец файла
  • std::ios::binary: Открытие в бинарном режиме

Заключение #

В этой главе мы рассмотрели основные возможности работы со строками и потоками в C++. Класс string предоставляет удобные методы работы со строками, а механизмы потоков ввода-вывода позволяют эффективно обрабатывать данные как из стандартных источников, так и из файлов.

Ключевые моменты:

  • Использование класса string для работы со строками
  • Применение потоков cin, cout, cerr
  • Форматирование вывода с помощью манипуляторов
  • Работа с файлами через ifstream, ofstream
  • Преобразование между строками и потоками

Практикуйте использование этих инструментов, и они станут незаменимыми в вашей работе с C++.