moerjielovecookie

Sawen_Blog

一个普通工科牲的博客网站
x
github
follow
email

C標準ライブラリによるファイルの読み書き

1 関数の紹介#

1.1 ライブラリ変数#

変数説明
size_t符号なし整数型で、sizeof キーワードの結果であり、オブジェクトのサイズを示す
FILEファイルストリーム型で、ファイルストリーム情報を格納するのに適したオブジェクト型

1.2 ライブラリマクロ#

マクロ説明
NULL空ポインタ定数
EOFファイルの終わりに達したことを示す負の整数
stderr、stdin、stdoutFILE 型を指すポインタで、それぞれ標準エラー、標準入力、標準出力ストリームに対応

1.3 ライブラリ関数#

1.3.1 fopen#

FILE *fopen(const char *filename, const char *mode) 
//指定されたモードmodeでfilenameが指すファイルを開く
mode説明
“r“読み取り用のファイルを開く。ファイルは存在しなければならない
”w“書き込み用の空ファイルを作成する。同名のファイルが存在する場合、古いファイルの内容を削除する
”a“ファイルに追加する。書き込み操作はファイルの末尾にデータを追加し、ファイルが存在しない場合はファイルを作成する
”r+“更新用のファイルを開く。読み取りと書き込みが可能で、そのファイルは存在しなければならない
”w+“読み書き用の空ファイルを作成する
“a+”読み取りと追加用のファイルを開く

関数は FILE ポインタを返し、失敗した場合は NULL を返す

1.3.2 fread#

宣言:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
//ptr:最小サイズ size*nmemb バイトのメモリブロックを指すポインタ
//size:読み取る各要素のサイズ(バイト単位)
//nmemb:要素の数
//stream:FILEオブジェクトを指すポインタで、入力ストリームを指定する

成功した読み取りの要素は size_t オブジェクトとして返される

1.3.3 fwrite#

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
//ptr:書き込む要素配列を指すポインタ
//size:読み取る各要素のサイズ(バイト単位)
//nmemb:要素の数
//stream:FILEオブジェクトを指すポインタで、出力ストリームを指定する

1.3.4 fseek#

int fseek(FILE *stream, long int offset, int whence)
//stream:FILEオブジェクトを指すポインタ
//offset:whenceに対するオフセット(バイト単位)
//whence:オフセットを追加する開始位置を示す

whence は通常、以下の 3 つの定数のいずれかである

定数説明
SEEK_SETファイルの先頭
SEEK_CURファイルポインタの現在位置
SEEK_ENDファイルの末尾

whence 位置からのバイト数を返す

1.3.5 ftell#

long int ftell(FILE *stream)

位置識別子の現在の値を返す

2 C 標準ライブラリを使用して TS ファイルを読み取り TXT に書き込む#

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fileInput, *fileOutput;
    unsigned char buffer[188];  // TSストリームの標準パケットサイズは188バイト
    size_t bytesRead;

    // TSファイルを開く
    fileInput = fopen("/home/sawen/my_test_pcie/test.ts", "rb");
    if (!fileInput) {
        perror("入力ファイルを開くのに失敗しました");
        return EXIT_FAILURE;
    } else {
        printf("入力ファイルが正常に開かれました。\n");
    }

    // ファイルサイズを確認
    fseek(fileInput, 0, SEEK_END);
    long fileSize = ftell(fileInput);
    rewind(fileInput);
    if (fileSize == 0) {
        printf("入力ファイルは空です。\n");
        fclose(fileInput);
        return EXIT_FAILURE;
    } else {
        printf("入力ファイルサイズ: %ld バイト。\n", fileSize);
    }

    // TXTファイルを開く
    fileOutput = fopen("output.txt", "w");
    if (!fileOutput) {
        perror("出力ファイルを開くのに失敗しました");
        fclose(fileInput);
        return EXIT_FAILURE;
    } else {
        printf("出力ファイルが正常に開かれました。\n");
    }

    // データを読み取りTXTファイルに書き込む
    int packetCount = 0;
    while ((bytesRead = fread(buffer, 1, sizeof(buffer), fileInput)) > 0) {
        for (size_t i = 0; i < bytesRead; ++i) {
            fprintf(fileOutput, "%02x ", buffer[i]); // バイトを16進数形式で書き込む
        }
        fprintf(fileOutput, "\n");  // 各TSパケットの後に改行
        packetCount++;
    }

    // 読み取ったデータがあるか確認
    if (packetCount == 0) {
        printf("ファイルからデータが読み取られませんでした。\n");
    } else {
        printf("処理したTSパケットの数: %d\n", packetCount);
    }

    // ファイルを閉じる
    fclose(fileInput);
    fclose(fileOutput);

    printf("データ転送が完了しました。\n");
    return EXIT_SUCCESS;
}

実行結果は以下の通り

1718891286912.png

188 バイトごとに 1 行で TXT に書き込まれているのが確認できます。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。