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 一般為下面三個常量
常量 | 描述 |
---|---|
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("Failed to open input file");
return EXIT_FAILURE;
} else {
printf("Input file opened successfully.\n");
}
// 檢查文件大小
fseek(fileInput, 0, SEEK_END);
long fileSize = ftell(fileInput);
rewind(fileInput);
if (fileSize == 0) {
printf("Input file is empty.\n");
fclose(fileInput);
return EXIT_FAILURE;
} else {
printf("Input file size: %ld bytes.\n", fileSize);
}
// 打開TXT文件
fileOutput = fopen("output.txt", "w");
if (!fileOutput) {
perror("Failed to open output file");
fclose(fileInput);
return EXIT_FAILURE;
} else {
printf("Output file opened successfully.\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]); // 將字節以十六進制格式寫入
}
fprintf(fileOutput, "\n"); // 每個TS包後換行
packetCount++;
}
// 檢查是否有數據被讀取
if (packetCount == 0) {
printf("No data read from file.\n");
} else {
printf("Processed %d TS packets.\n", packetCount);
}
// 關閉文件
fclose(fileInput);
fclose(fileOutput);
printf("Data transfer complete.\n");
return EXIT_SUCCESS;
}
運行結果如下
可以看到以 188 個字節為一行寫入 txt