Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C/C++のlseek()でn番目ごとのバイトを読み取り、別のファイルに書き込む方法

このチュートリアルでは、C言語のシステムコール lseek() を使って、ファイルから n バイトおきにデータを読み出し、その内容を別のファイルへ書き込むプログラムについて解説します。

処理の概要

このプログラムでは、2つのテキストファイル(start.txt と end.txt)を用意します。目的は、1つ目のファイル(入力ファイル)から内容を読み込み、lseek() を使ってファイルポインタを移動させながら、n バイトごとに1バイトずつ抜き出し、2つ目のファイル(出力ファイル)へ書き込むことです。

lseek() は、ファイルディスクリプタが指す読み書き位置(オフセット)を変更するためのシステムコールです。これにより、ファイル内の任意の位置へジャンプしながらデータを読み取ることができます。

使用する主な関数

  • open(): ファイルを開き、ファイルディスクリプタを取得する
  • read(): ファイルディスクリプタからデータを読み込む
  • write(): ファイルディスクリプタへデータを書き込む
  • lseek(): ファイルオフセット(読み書き位置)を移動させる
  • close(): ファイルディスクリプタを閉じる

サンプルコード

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>

void func(char arr[], int n){
    // 入力ファイルを読み取り専用でオープン
    int f_write = open("start.txt", O_RDONLY);
    // 出力ファイルを書き込み専用でオープン
    int f_read = open("end.txt", O_WRONLY);
    int count = 0;

    // 1バイトずつ読み込む
    while (read(f_write, arr, 1)){
        if (count < n) {
            // 最初の読み出し後、n バイト先へポインタを移動
            lseek(f_write, n, SEEK_CUR);
            write(f_read, arr, 1);
            count = n;
        }
        else{
            // 以降は 2n バイトおきにポインタを移動
            count = (2*n);
            lseek(f_write, count, SEEK_CUR);
            write(f_read, arr, 1);
        }
    }
    close(f_write);
    close(f_read);
}

int main(){
    char arr[100];
    int n;
    n = 5;          // 間隔として 5 を指定
    func(arr, n);
    return 0;
}

コードの解説

このプログラムでは、変数 n に 5 を設定しているため、入力ファイルから「6番目・16番目・26番目…」というように、n バイト間隔で1バイトずつデータを読み出します。

  1. まず read() で現在位置の1バイトを読み込みます。
  2. 初回(count < n の場合)は lseek() で n バイト先へポインタを進めます。
  3. 2回目以降は count = 2 * n として、さらに 2n バイト先へポインタを移動させます。
  4. 読み取った各バイトは write() によって出力ファイルへ順次書き込まれます。

なお、SEEK_CUR は「現在のファイル位置からの相対移動」を意味しており、lseek() の第3引数として指定しています。

実行結果

入力ファイル(start.txt):

C/C++のlseek()でn番目ごとのバイトを読み取り、別のファイルに書き込む方法

出力ファイル(end.txt):

C/C++のlseek()でn番目ごとのバイトを読み取り、別のファイルに書き込む方法

実行後の出力ファイルを見ると、元のファイルから n バイトおきに抽出された文字だけが書き込まれていることが確認できます。このように lseek() を活用することで、ファイル全体を読み込むことなく、必要な位置のデータだけを効率的に処理できます。

  1. C/C++プログラムで放物線の頂点・焦点・準線を求める方法

    この記事では、C言語またはC++のプログラムを使って、放物線の頂点・焦点・準線(ダイレクトリックス)を求める方法を解説します。これらのパラメータを計算するには、放物線の一般方程式が必要です。一般式は次のとおりです。y = ax2 + bx + cここで、係数 a、b、c の値はあらかじめ与えられているものとします。各パラメータを求める公式頂点(Vertex)放物線の頂点は、次の座標で表されます。x = −b / (2a)y = (4ac − b2) / (4a)焦点(Focus)焦点は、頂点より 1/(4a) だけ上に位置します(a > 0 の場合)。x = −b / (2a)y = (

  2. PythonのopenpyxlモジュールでExcelファイルを読み書きする方法【初心者向け完全ガイド】

    Pythonには、Excelファイル(.xlsx)を操作するためのopenpyxlという便利なモジュールが用意されています。このモジュールを使えば、Excelファイルの新規作成、データの書き込み・読み取り、シートの追加や管理など、さまざまな操作をプログラムから自動的に行うことができます。 本記事では、openpyxlの基本的な使い方を、実際に動作するサンプルコードとともに順番に解説していきます。 openpyxlのインストール方法 openpyxlは標準ライブラリではないため、まずインストールが必要です。コマンドプロンプト(またはターミナル)で以下のコマンドを実行してください。 pip ins