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