C++樹林– category –
-
C++樹林
【C++】std::to_stringで数値を文字列に変換する方法
はじめに C++で、計算結果の数値と、説明の文字列を連結して一つのメッセージを作成したい、という場面は頻繁にあります。C++では、std::stringオブジェクトと数値を + で直接連結することはできません。 この問題を解決するために、C++11では <string&... -
C++樹林
【C++】std::string::findで文字列を検索する方法とnposの使い方
はじめに C++のstd::stringで、「ある文字列の中に、特定のキーワードが含まれているか」を調べたい場面は非常に多くあります。この目的のために、std::stringクラスには**.find()**という強力なメンバ関数が用意されています。 .find()は、文字列の中から... -
C++樹林
【C++20】starts_with, ends_withで文字列の前方/後方一致を判定する方法
はじめに C++で、「ファイル名が _backup で終わっているか」「URLが https:// で始まっているか」といった、文字列の前方一致または後方一致を判定したい場面は頻繁にあります。 従来は、.substr() や .compare() といったメンバ関数を組み合わせて、少し... -
C++樹林
【C++17】boyer_moore_searcherで高速な文字列検索を行う方法
はじめに C++で、長い文字列の中から特定のパターン(部分文字列)を探し出す場合、標準ライブラリ<algorithm>のstd::search関数が利用できます。 C++17では、このsearch関数と組み合わせて使うための検索オブジェクト(searcher)が導入されました... -
C++樹林
【C++】std::regex_matchで正規表現を使って文字列のマッチングを行う方法
はじめに C++で、ユーザーが入力した文字列が「メールアドレスの形式に合っているか」「YYYY-MM-DDという日付の形式になっているか」といった、特定のフォーマット検証を行いたい場合があります。 C++11で導入された**<regex>ライブラリのstd::regex... -
C++樹林
【C++】std::regex_replaceで正規表現を使って文字列を置換する方法
はじめに C++で、「YYYY/MM/DD」という形式の日付文字列を、「YYYY年MM月DD日」という形式に変換したい、といった高度な文字列置換を行いたい場合があります。 C++11で導入された**<regex>ライブラリのstd::regex_replace**関数は、このような複雑な... -
C++樹林
【C++17】std::string_view の使い方 | 文字列コピーを回避しパフォーマンス向上
はじめに C++で、関数に文字列を渡す際、引数を const std::string& とするのが一般的でした。しかし、この方法にはパフォーマンス上の問題があります。もし、関数にC言語スタイルの文字列リテラル(例: "Hello") を渡そうとすると、その場で一時的な ... -
C++樹林
【C++20】std::format の使い方 | 型安全な文字列フォーマット入門
はじめに C++で、数値や文字列を組み合わせて一つの整形された文字列を作成する際、従来はstringstreamやC言語由来のprintfファミリーが使われてきました。しかし、これらはコードが冗長になったり、型安全性が低かったりという問題がありました。 C++20で... -
C++樹林
【C++20】std::formatで自作の型を文字列化する方法 (formatterの特殊化)
はじめに C++20で導入された**std::format**は、printfのように、型安全で拡張性の高い書式設定機能を提供します。intやstringといった基本型は標準でサポートされていますが、「自作したクラスやenum(列挙型)」をformatで直接扱いたい、という場面が必... -
C++樹林
【C++20】views::splitで文字列を指定した区切り文字で分割する方法
はじめに C++で、「A,B,C」のようなカンマ区切りの文字列を、個々の要素「A」「B」「C」に分割したい、という場面は非常に頻繁にあります。 従来はstd::getlineとstd::stringstreamを組み合わせるなどの手動での処理が必要でしたが、C++20のRangesライブラ... -
C++樹林
【C++23】views::join_withで文字列コンテナを指定した区切り文字で連結する方法
はじめに C++で、vector<string>などに格納された複数の文字列を、カンマ区切り(,)のような特定の文字列を間に挟んで、一つの大きな文字列に連結したい場合があります。従来はforループで手動で連結する必要がありましたが、C++23のRangesライブラ... -
C++樹林
【C++】cinによる標準入力の基本 | キーボードから値を受け取る方法
はじめに C++のプログラムで、ユーザーに数値を入力してもらったり、名前を打ち込んでもらったりと、キーボードからの入力を受け取りたい場面は必ずあります。この標準的な入力機能を提供するのが、<iostream>ヘッダーで定義されているstd::cin (cha... -
C++樹林
【C++】coutによる標準出力の基本 | 文字や数値を画面に表示する方法
はじめに C++の学習において、プログラムの動作や変数の内容を確認するために、コンソール(黒い画面)に結果を表示するのは最も基本的な操作です。この標準的な出力機能を提供するのが、<iostream>ヘッダーで定義されているstd::cout (character ou... -
C++樹林
【C++】cinの入力における空白文字の扱いの基本 (noskipws, ws)
はじめに C++の cin や ifstream といった入力ストリームは、>> 演算子を使うと、デフォルトで入力中の空白文字(スペース、タブ、改行など)を自動的に読み飛ばしてくれます。これにより、「10 20」という入力を2つの整数として簡単に読み込めます... -
C++樹林
【C++】std::getline で、スペースを含む一行を読み取る方法
はじめに C++で cin >> my_string; のように入力ストリーム演算子 >> を使うと、スペースやタブ、改行までを一つの区切りとして、単語ごとにしか文字列を読み取れません。 「Hello World」のように、スペースを含む一行全体を一つの文字列とし... -
C++樹林
【C++】ストリームのエラー状態を判定し、回復する方法 (fail, clear)
はじめに C++で cin や ifstream を使ってデータを読み込む際、ユーザーが数値を入力すべきところに文字列を入力するなど、予期せぬ入力によってストリームがエラー状態になることがあります。一度エラー状態になると、そのストリームはそれ以降の入力を全... -
C++樹林
【C++】cin / ifstream で入力の終わり(EOF)を判定する方法
はじめに C++で、ファイルや標準入力から、データがいくつあるか分からないまま、全てのデータを読み終わりまで処理したい、という場面は非常に多くあります。このような場合、入力ストリームの状態をチェックして、ループを終了させる必要があります。 入... -
C++樹林
【C++】ファイル操作の基本 ofstream(書き込み)とifstream(読み込み)の使い方
はじめに C++で、プログラムのデータをファイルに保存したり、ファイルからデータを読み込んだりするには、ファイルストリームを利用するのが標準的な方法です。<fstream> ヘッダーには、ファイル操作のための主要なクラスが用意されています。 std:... -
C++樹林
【C++】文字列ストリーム (stringstream) の使い方 | メモリ上で文字列を読み書きする
はじめに C++で、数値を文字列に変換したり、逆に文字列を数値に変換したり、あるいはスペースで区切られた文字列を単語ごとに分解したい、といった場面は頻繁にあります。 標準ライブラリ <sstream> ヘッダーで提供される「文字列ストリーム」を使... -
C++樹林
【C++】ストリームの読み書き位置を移動する方法 (seekg, tellg)
はじめに C++のファイルストリーム (fstream) や文字列ストリーム (stringstream) を扱う際、通常は先頭から末尾へ順番に読み書きを行いますが、時には「特定のバイト位置まで一気に移動したい」「一度読んだ場所まで戻って、もう一度読み直したい」という... -
C++樹林
【C++】ファイルの内容を全て一度に読み込む方法 (istreambuf_iterator)
はじめに C++でファイルの内容を全て vector や string に読み込みたい場合、while ループで1文字または1行ずつ読み込んでいくのが基本的な方法です。しかし、この方法はコードが冗長になりがちです。 よりモダンで簡潔なアプローチが、std::istreambuf_it... -
C++樹林
【C++】自作クラスを入出力ストリーム (ostream/istream) に対応させる方法
はじめに C++では、cout(コンソール出力)や cin(コンソール入力)だけでなく、ofstream(ファイル出力)や stringstream(文字列ストリーム)など、様々な種類の「ストリーム」が提供されています。これらは全て、ostream(出力ストリーム)とistream(... -
C++樹林
【C++17】std::filesystem::path の使い方 | パスの構築と連結
はじめに C++17で導入された<filesystem>ライブラリは、ファイルシステムのパスを統一的に扱うための**std::filesystem::path**というクラスを提供します。このpathオブジェクトは、OSによるパス区切り文字の違い(Windowsの\とLinux/macOSの/)など... -
C++樹林
【C++17】filesystemライブラリのエラーハンドリング(error_codeと例外)
はじめに C++17の<filesystem>ライブラリでファイル操作を行う際、パスが存在しない、アクセス権がない、などの理由でエラーが発生することがあります。これらのエラーに適切に対処しないと、プログラムが予期せずクラッシュする可能性があります。 ... -
C++樹林
【C++17】filesystemでファイルやディレクトリをコピーする方法
はじめに C++で、ファイルのバックアップを作成したり、ディレクトリ構造を丸ごと複製したりしたい場合があります。 C++17で導入された <filesystem> ライブラリは、このファイルシステムのコピー操作を、OSに依存しない移植性の高いコードで簡単に... -
C++樹林
【C++17】std::filesystem::rename でファイルやディレクトリの名前を変更/移動する方法
はじめに C++で、プログラムからファイルやディレクトリの名前を変更したり、別のディレクトリへ移動させたりしたい場合があります。 C++17で導入された <filesystem> ライブラリは、このための**std::filesystem::rename()**という関数を提供してい... -
C++樹林
【C++17】filesystemでファイルやディレクトリを削除する方法
はじめに C++で、プログラムが生成した一時ファイルや、空になったディレクトリを削除したい場合があります。 C++17で導入された <filesystem> ライブラリは、このファイルシステムの削除操作を、OSに依存しない移植性の高いコードで簡単に行うため... -
C++樹林
【C++17】filesystemでディレクトリ(フォルダ)を作成する方法
はじめに C++で、マクロの実行結果を保存するための新しいフォルダを自動で作成したい、という場面はよくあります。 C++17で導入された <filesystem> ライブラリは、このディレクトリ作成をOSに依存しない、移植性の高いコードで簡単に行うための関... -
C++樹林
【C++17】filesystemでディレクトリ内のファイル一覧を列挙する方法
はじめに C++で、特定のディレクトリに含まれる全てのファイルやフォルダの一覧を取得したい、という場面は頻繁にあります。 C++17で導入された <filesystem> ライブラリは、この「ディレクトリ内のエントリ(ファイルやフォルダ)を走査する」ため... -
C++樹林
【C++17】std::filesystem::exists でファイルやディレクトリの存在を確認する方法
はじめに C++でファイルを開いたり、ディレクトリを作成したりする際、操作の前に「そのパスが本当に存在するか」を確認することは、エラーを未然に防ぐ上で非常に重要です。 C++17で導入された <filesystem> ライブラリは、この存在確認を簡単に行...