函数介绍
库变量
| 变量 | 描述 | 
|---|---|
| size_t | 无符号整数类型,是sizeof关键字的结果,表示对象大小 | 
| FILE | 文件流类型,适合存储文件流信息的对象类型 | 
库宏
| 宏 | 描述 | 
|---|---|
| NULL | 空指针常量 | 
| EOF | 表示已经到达文件结束的负整数 | 
| stderr、stdin、stdout | 指向FILE类型的指针,分别对应标准错误、标准输入和标准输出流 | 
库函数
fopen
FILE *fopen(const char *filename, const char *mode) 
//以给定的模式mode打开filename指向的文件
| mode | 描述 | 
|---|---|
| “r“ | 打开一个用于读取的文件,文件必须存在 | 
| ”w“ | 创建一个用于写入的空文件。若存在同名文件,则删除旧文件的内容 | 
| ”a“ | 追加到一个文件,写操作向文件末尾追加数据,文件不存在就创建文件 | 
| ”r+“ | 打开一个用于更新的文件,可读取也可写入。该文件必须存在 | 
| ”w+“ | 创建一个用于读写的空文件 | 
| “a+” | 打开一个用于读取和追加的文件 | 
函数返回一个FILE指针,否则返回NULL
fread
声明:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
//ptr:指向带有最小尺寸 size*nmemb 字节的内存块的指针
//size:读取的每个元素的大小,以字节为单位
//nmemb:元素的个数
//stream:指向FILE对象的指针,指定了一个输入流
成功读取的元素会以size_t对象返回
fwrite
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
//ptr:指向被写入元素数组的指针
//size:读取的每个元素的大小,以字节为单位
//nmemb:元素的个数
//stream:指向FILE对象的指针,指定了一个输出流
fseek
int fseek(FILE *stream, long int offset, int whence)
//stream:指向FILE对象的指针
//offset:相对whence的偏移量,以字节为单位
//whence:表示开始添加偏移的位置
whence一般为下面三个常量
| 常量 | 描述 | 
|---|---|
| SEEK_SET | 文件开头 | 
| SEEK_CUR | 文件指针的当前位置 | 
| SEEK_END | 文件的末尾 | 
返回从whence位置开始查找的字节数
ftell
long int ftell(FILE *stream)
返回位置标识符的当前值
使用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













![[激光原理与应用-109]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 12 - 焊接工艺之影响焊接效果的因素](https://i-blog.csdnimg.cn/direct/090756fef633402a80d0b6f2414d1c9b.png)



![[GHCTF 2024 新生赛]ezzz_unserialize](https://img-blog.csdnimg.cn/img_convert/473c5921f287dc6e9469bfde25d833dd.png)

