C语言fread、fwrite读写二进制(bin)文件

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;
}

猜你喜欢

转载自blog.csdn.net/zfjBIT/article/details/129326836