函数介绍
库变量
变量 | 描述 |
---|---|
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