moerjielovecookie

Sawen_Blog

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

C標準庫讀寫文件

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;
}

運行結果如下

1718891286912.png

可以看到以 188 個字節為一行寫入 txt

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。