C++におけるtellgとseekgの使い方


tellg関数は、現在の読み取り位置を取得するために使用されます。これは、ファイル内のどの位置から読み取りを行っているかを確認する際に役立ちます。tellg関数は、istreamクラス(例えばifstream)のオブジェクトに対して使用されます。

以下はtellg関数の使用例です。

#include <iostream>
#include <fstream>
int main() {
    std::ifstream file("example.txt");
    if (file.is_open()) {
        file.seekg(0, std::ios::end);
        int length = file.tellg();
        file.seekg(0, std::ios::beg);
        char* buffer = new char[length];
        file.read(buffer, length);
        std::cout << "ファイルの
内容:
 " << buffer << std::endl;
        delete[] buffer;
        file.close();
    } else {
        std::cout << "ファイルを開けませんでした。" << std::endl;
    }
    return 0;
}

上記の例では、"example.txt"という名前のテキストファイルを開き、その内容を読み取ります。まず、seekg(0, std::ios::end)を使用してファイルの終端に移動し、tellg()で現在の読み取り位置を取得します。次に、seekg(0, std::ios::beg)を使用して読み取り位置をファイルの先頭に戻し、read関数を使用してファイルの内容をバッファに読み込みます。

seekg関数は、読み取り位置を設定するために使用されます。これは、ファイル内の特定の位置にジャンプする際に役立ちます。seekg関数もistreamクラスのメンバ関数であり、以下のように使用されます。

file.seekg(offset, origin);

ここで、offsetは移動するバイト数を表し、originは基準位置を指定します。originには以下のいずれかの値を指定できます。

  • std::ios::beg: ファイルの先頭を基準位置とします。
  • std::ios::cur: 現在の読み取り位置を基準位置とします。
  • std::ios::end: ファイルの終端を基準位置とします。

以下はseekg関数の使用例です。

#include <iostream>
#include <fstream>
int main() {
    std::ifstream file("example.txt");
    if (file.is_open()) {
        file.seekg(5, std::ios::beg);
        char ch;
        file >> ch;
        std::cout << "5番目の文字: " << ch << std::endl;
        file.close();
    } else {
        std::cout << "ファイルを開けませんでした。" << std::endl;
    }
    return 0;
}

上記の例では、"example.txt"という名前のテキストファイルを開き、5番目の文字を読み取ります。seekg(5, std::ios::beg)を使用して読み取り位置をファイルの先頭から5バイト目に移動し、>>演算子を使用して1文字を読み取ります。

これらの関数を使用することで、C++でファイルの読み書き位置を制御することができます。上記の例を参考に、自分のプログラムに応じた使い方をしてください。