C/C++ Ready | Программирование
15.2K subscribers
1.47K photos
94 videos
726 links
Авторский канал по разработке на C и C++.
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!

Cотрудничество: @energy_c

РКН: https://clck.ru/3QREHc
Download Telegram
Пишем вывод последних строк файла на C++!

Иногда нужно быстро посмотреть конец лога или временного файла. Сделаем маленькую функцию, которая хранит только последние N строк и не загружает весь файл в память.

Для этого удобно использовать std::deque. Он позволяет добавлять строки в конец и удалять самые старые строки из начала.

Сначала подключим нужные заголовки:
#include <deque>
#include <fstream>
#include <iostream>
#include <string>


Теперь открываем файл и готовим контейнер:
std::ifstream in(path);
std::deque<std::string> tail;
std::string line;


При чтении добавляем новую строку в конец:
while (std::getline(in, line)) {
tail.push_back(line);
}


Если строк стало больше лимита, удаляем самую старую:
if (tail.size() > limit) {
tail.pop_front();
}


В итоге печатаем то, что осталось в deque:
for (const auto& row : tail) {
std::cout << row << '\n';
}


Такой подход работает потоково. Даже если лог большой, в памяти одновременно лежит только нужное количество последних строк.

📣 C++ Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍4🔥4👎2
Собираем простой пул объектов на C++!

Иногда объект дорого создавать заново каждый раз. Например, буфер, парсер, контекст или структура с заранее выделенной памятью.

В этой задаче:
• храним свободные объекты
• выдаём готовый экземпляр
• возвращаем объект обратно
• очищаем состояние перед повторным использованием


Такой подход помогает снизить количество аллокаций и делает повторное использование ресурсов более явным.

📣 C++ Ready | #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍43🔥1😁1
Почему setprecision не всегда означает количество знаков после точки?

В C++ для форматирования дробных чисел часто используют std::setprecision. На первый взгляд кажется, что он задаёт количество цифр после запятой.

Но без std::fixed это не так:
std::cout << std::setprecision(3) << 123.456;


Результат будет не 123.456 с тремя знаками после точки. Поток выведет три значащие цифры:
123


Если нужны знаки после точки, добавляют std::fixed:
std::cout << std::fixed << std::setprecision(3)
<< 123.456;


Теперь результат будет предсказуемым:
123.456


Для маленьких чисел разница ещё заметнее:
std::cout << std::setprecision(2) << 0.012345;


Без fixed поток снова считает значащие цифры и может перейти к компактной форме вывода.

std::setprecision сам по себе управляет точностью, а не обязательно количеством символов после точки.

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍5🔥4
This media is not supported in your browser
VIEW IN TELEGRAM
👨‍💻 CppCourse — курс по C++ и объектно-ориентированному программированию!

Обучение идёт от работы с памятью, классов и наследования до шаблонов, STL, RAII, умных указателей и других возможностях C++. Теория закрепляется на учебном проекте, а ещё есть лабораторные, экзаменационные материалы и отдельный демо-проект с юнит-тестами, паттернами и архитектурой MVP.

Оставляю ссылочку: GitHub 📱


📣 C++ Ready | #репозиторий
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍7🔥4
Не отставайте от рынка — учитесь со скидкой 16%

Если чувствуете, что стоите на месте, и хотите освоить востребованную профессию, — сейчас хороший момент начать.

Потому что до 30 сентября на все курсы Практикума действует скидка 16%

Выбрать курс

Вы сможете:

— получить актуальные навыки;
— освоить ИИ-инструменты для работы;
— перенять опыт экспертов, которые двигают индустрию;
— попасть в сообщество выпускников, где можно попросить совета и, возможно, найти будущих коллег.

Просто выберите курс, начните учиться бесплатно и получите скидку 16% — она автоматически появится в личном кабинете. 

Учиться!

Erid: 2SDnjc7khBq
Название: ООО "ЯНДЕКС"
ИНН: 7736207543
Почему std::move сам ничего не перемещает?

Кажется, что вызов уже перенёс данные из одного объекта в другой.

На деле std::move только сообщает компилятору, что объект можно рассматривать как временный. Само перемещение происходит, когда другой код выбирает move-конструктор или move-присваивание.
std::string source = "report";
std::string target = std::move(source);


Здесь строка target забирает ресурсы source. После этого source остаётся валидной, но её содержимое не определено контрактом и часто оказывается пустым.

Поэтому нельзя писать логику, которая рассчитывает на конкретное значение после перемещения.
send(std::move(message));
// message больше не используем как прежнее значение


У std::move есть ещё одна ловушка. Перемещение из const-объекта обычно превращается в копирование, потому что move-конструктор не может менять источник.
const std::string name = "ready";
auto copy = std::move(name);


Такой код компилируется, но для std::string будет создана копия. Полезно применять std::move на последнем использовании объекта, когда прежнее значение действительно больше не нужно.

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍106🔥3
Большой разбор C++ механик!

Автор собрал масштабный материал по приёмам, которые встречаются в современном и легаси C++ коде. Внутри есть RAII, Scope Guard, умные указатели, move-семантика, шаблоны, исключения, Pimpl и десятки других идей с объяснением, откуда они появились.

В статье разбирают:
• как связывать владение ресурсом со временем жизни объекта
• почему noexcept влияет на производительность контейнеров
• где старые идиомы помогают понять код движков и библиотек

Продолжай читать на Habr


📣 C++ Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍5🔥3
Почему std::move иногда вообще ничего не двигает?

std::move не перемещает объект сам по себе. Он только превращает выражение в rvalue-ссылку, чтобы компилятор мог выбрать move-конструктор или move-присваивание.

Но если объект const, перемещение может неожиданно превратиться в обычное копирование:
const std::string name = "ready";

std::string copy = std::move(name);


Кажется, что здесь будет move.

Но move-конструктор строки обычно принимает неконстантную rvalue-ссылку:
std::string(std::string&& other);


А из const объекта нельзя безопасно “забрать” внутреннее состояние, потому что это изменило бы объект.

Поэтому компилятор выбирает копирование:
const std::string name = "ready";
std::string result = std::move(name); // copy


Нормальное перемещение работает с неконстантным объектом:
std::string name = "ready";
std::string result = std::move(name); // move


После такого name остаётся валидным, но его содержимое уже не стоит использовать как прежнее значение:
std::cout << result << '\n';


std::move не гарантирует перемещение. Если объект const, чаще всего ты получишь копирование, просто записанное очень уверенным синтаксисом.

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍4🔥3
Шпаргалка по форматированию через библиотеку fmt!

На картинке собраны плейсхолдеры, именованные аргументы, выравнивание, ширина поля, точность, форматы чисел, строк, указателей и диапазонов.

Например, fmt::format собирает строку по шаблону, fmt::print выводит её сразу в консоль, а fmt::format_to пишет результат в готовый буфер или итератор.

Сохрани, чтобы не потерять!

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2🔥1