C标准库读写文件

1 函数介绍

1.1 库变量

变量 描述
size_t 无符号整数类型,是sizeof关键字的结果,表示对象大小
FILE 文件流类型,适合存储文件流信息的对象类型

1.2 库宏

描述
NULL 空指针常量
EOF 表示已经到达文件结束的负整数
stderr、stdin、stdout 指向FILE类型的指针,分别对应标准错误、标准输入和标准输出流

1.3 库函数

1.3.1 fopen

1
2
FILE *fopen(const char *filename, const char *mode) 
//以给定的模式mode打开filename指向的文件
mode 描述
“r“ 打开一个用于读取的文件,文件必须存在
”w“ 创建一个用于写入的空文件。若存在同名文件,则删除旧文件的内容
”a“ 追加到一个文件,写操作向文件末尾追加数据,文件不存在就创建文件
”r+“ 打开一个用于更新的文件,可读取也可写入。该文件必须存在
”w+“ 创建一个用于读写的空文件
“a+” 打开一个用于读取和追加的文件

函数返回一个FILE指针,否则返回NULL

1.3.2 fread

声明:

1
2
3
4
5
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

1
2
3
4
5
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
//ptr:指向被写入元素数组的指针
//size:读取的每个元素的大小,以字节为单位
//nmemb:元素的个数
//stream:指向FILE对象的指针,指定了一个输出流

1.3.4 fseek

1
2
3
4
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

1
long int ftell(FILE *stream)

返回位置标识符的当前值

2 使用C标准库读取TS文件并写入txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#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


C标准库读写文件
https://www.moerjielovecookie.icu/2024/06/20/C标准库读写文件/
作者
Sawen Moerjie
发布于
2024年6月20日
许可协议