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

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。