1 関数の紹介#
1.1 ライブラリ変数#
変数 | 説明 |
---|---|
size_t | 符号なし整数型で、sizeof キーワードの結果であり、オブジェクトのサイズを示す |
FILE | ファイルストリーム型で、ファイルストリーム情報を格納するのに適したオブジェクト型 |
1.2 ライブラリマクロ#
マクロ | 説明 |
---|---|
NULL | 空ポインタ定数 |
EOF | ファイルの終わりに達したことを示す負の整数 |
stderr、stdin、stdout | FILE 型を指すポインタで、それぞれ標準エラー、標準入力、標準出力ストリームに対応 |
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;
}
実行結果は以下の通り
188 バイトごとに 1 行で TXT に書き込まれているのが確認できます。