1. fread()
fread()函数用来从指定文件中读取块数据。所谓块数据,也就是若干个字节的数据,可以是一个字符,可以是一个字符串,可以是多行数据,并没有什么限制。fread() 的原型为:
size_t fread ( void *ptr, size_t size, size_t count, FILE *fp );
2. fwrite()
fwrite() 函数用来向文件中写入块数据,它的原型为:
size_t fwrite ( void * ptr, size_t size, size_t count, FILE *fp );
对参数的说明:
- ptr 为内存区块的指针,它可以是数组、变量、结构体等。fread() 中的 ptr 用来存放读取到的数据,fwrite() 中的 ptr用来存放要写入的数据。
- size:表示每个数据块的字节数。
- count:表示要读写的数据块的块数。
- fp:表示文件指针。
理论上,每次读写 size*count 个字节的数据。
3. fseek()
fseek() 函数设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。
int fseek(FILE *stream, long int offset, int whence)
对参数的说明:
- stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
- offset – 这是相对 whence的偏移量,以字节为单位。
- whence – 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一:
SEEK_SET:文件的开头
SEEK_CUR:文件指针的当前位置
SEEK_END:文件的末尾
4. rewind()
rewind() 函数设置文件位置为给定流 stream 的文件的开头。
void rewind(FILE *stream)
rewind函数作用等同于 (void)fseek(stream, 0L, SEEK_SET)
;
5. 测试用例:读写bin文件
#include <stdlib.h>
#include <stdio.h>
#include <string>
#define NUM 10
int main()
{
int i = 0;;
FILE* pFile = nullptr;
int *arr = (int*)malloc(NUM * sizeof(int));
for (i = 0; i < NUM; i++)
{
arr[i] = i;
}
pFile = fopen("myfile.bin", "wb+");
if (!pFile)
{
printf("fopen error!\n");
return -1;
}
int n = fwrite(arr, sizeof(int), NUM, pFile);
fclose(pFile);
int *recvarr = (int*)malloc(NUM * sizeof(int));
pFile = fopen("myfile.bin", "rb+");
if (!pFile)
{
printf("fopen error!\n");
return -1;
}
fseek(pFile, 0, SEEK_END);
int file_size = ftell(pFile) / sizeof(int);
printf("data size: %d\n", file_size);
if (file_size != NUM)
{
printf("read error!\n");
fclose(pFile);
return -1;
}
//fseek(pFile, 0, SEEK_SET);
rewind(pFile);
n = fread(recvarr, sizeof(int), NUM, pFile);
for (i = 0; i < NUM; i++)
{
printf("%d ", recvarr[i]);
}
fclose(pFile);
free(arr);
free(recvarr);
return 0;
}