C++のファイル処理でseekg()を使って読み取り位置を設定する方法
seekg() は、C++ の iostream ライブラリに含まれる関数の一つで、ファイル内の任意の位置へ移動(シーク)するために使用されます。「seek get」の略であり、主に入力ストリームから次に読み込む文字の位置を指定する役割を担います。C++ のファイル処理では、ファイルの途中からデータを読み込みたい場合などに非常に便利な関数です。
seekg() の構文
istream& seekg(streamoff offset, ios_base::seekdir dir); istream& seekg(streampos position);
パラメータの説明
- position:ストリームバッファ内の新しい位置を表します。
- offset:streamoff 型の整数値で、dir パラメータを基準としたストリームバッファ内の相対的なオフセットを表します。
- dir:シークの方向を指定します。ios_base::seekdir 型のオブジェクトで、後述の定数のいずれかを指定できます。
シーク方向として使える3つの定数
ios_base::beg— ストリームバッファの先頭を基準にします。ios_base::cur— ストリームバッファ内の現在位置を基準にします。ios_base::end— ストリームバッファの末尾を基準にします。
処理の手順
- 入出力両用モードでデータファイルを開きます。
- ファイルに「TutorialsPoint」という文字列を書き込みます。
- ファイルの先頭から9番目の位置へシークします。
- その位置から5文字を読み込み、バッファ F に格納します。
- F の終端にヌル文字('\0')を追加して、文字列として扱えるようにします。
- 内容を標準出力に表示します。
- ファイルを閉じて終了します。
サンプルコード
#include <fstream>
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
fstream File("d.txt", ios::in | ios::out);
File << "TutorialsPoint";
File.seekg(9, ios::beg); // 先頭から9文字目へ移動
char F[9];
File.read(F, 5); // 5文字を読み込む
F[5] = 0; // 終端にヌル文字を追加
cout << F << endl;
File.close();
}
実行結果
Point
コードの解説
このプログラムでは、まず「TutorialsPoint」(全14文字)をファイルに書き込んでいます。続いて seekg(9, ios::beg) を呼び出すことで、読み取り位置がファイルの先頭から9文字目(インデックス9)に移動します。この位置にあるのは「P」なので、その後の File.read(F, 5) によって「Point」の5文字が読み込まれます。
なお、seekg() は入力ストリーム(読み込み用)の位置を制御する関数です。一方、出力ストリーム(書き込み用)の位置を制御したい場合は seekp() を使用します。両者を組み合わせることで、ファイル内の任意の場所に対して柔軟な読み書きが可能になります。
-
C++で解く「3nスライスのピザ」問題 ― 動的計画法でスライスの合計を最大化する方法
問題の概要 大きさがまちまちの 3n 個のスライスからなるピザがあるとします。私と友人2人は、次のルールに従ってピザを取っていきます。 私が任意のスライスを1枚選びます。 友人のAmalは、私が選んだスライスの反時計回り方向に隣接するスライスを取ります。 友人のBimalは、私が選んだスライスの時計回り方向に隣接するスライスを取ります。 ピザのスライスがなくなるまで、この手順を繰り返します。 各スライスの大きさは、時計回りの順に並べた環状配列 slices として与えられます。求めるのは、私が手にできるスライスの大きさの合計の最大値です。 入出力例 入力が [9, 8, 6, 1, 1,
-
【C++入門】substr()関数で部分文字列を取得する方法
C++における部分文字列とは 部分文字列(substring)とは、ある文字列の一部分を指します。C++では、標準ライブラリのsubstr()関数を使うことで、元の文字列から任意の部分文字列を簡単に取り出せます。 substr()関数は、次の2つの引数を受け取ります。 pos:部分文字列の抽出を開始する位置(先頭の文字は0番目) len:抽出する文字数 以下に、C++で部分文字列を取得するプログラムの例を示します。 サンプルコード #include <iostream> #include <string.h> using namespace std; int ma