fread写入结构体

#include<stdio.h>
#include <stdlib.h>
#define N 4
typedef struct student_type
{
	char name[10];
	int num;
	int score;
}student_type;
int main()
{
	student_type temp;
	student_type stud[4] = {{"merry",1,77},{"white",2,100},{"sam",3,88},{"jack",4,99}};
	int i,j;
	FILE *fp;
	fp = fopen("stu_list.txt","wb");
	if(fp==NULL)
	{
		printf("cannot open file.\n");
		exit(0);
	}
	fwrite(&stud,sizeof(student_type),4,fp);
	fclose(fp);
	fp = NULL;

	fp = fopen("stu_list.txt","rb");
	fseek(fp,0L,SEEK_SET);
	fread(&stud,sizeof(student_type),4,fp);
	fclose(fp);
	fp = NULL;
	for(i=0;i<N;i++)
	{
		for(j=0;j<N-i-1;j++)
		{
			if(stud[j].score<stud[j+1].score)
			{
				temp = stud[j+1];
				stud[j+1] = stud[j];
				stud[j] = temp;
			}
		}
	}
	for(i=0;i<N;i++)
		printf("%s\t%d\t%d\n",stud[i].name,stud[i].num,stud[i].score);

}


#include <stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct Person{
	char name[10];
	float height;
	float weight;
}Person;

int main()
{
	Person persons[3] = {{"sam",1.78,73.6},{"jack",1.65,49},{"mary",1.67,80}};
	FILE *pFile = NULL;
	pFile = fopen("d.dat","wb");
	if (NULL != pFile)
	{
		fwrite(&persons,sizeof(Person),3,pFile);
		fclose(pFile);
		pFile = NULL;
	}
	else
	{
		printf("写文件失败!");
		return 0;
	}
	pFile = fopen("d.dat","rb");
	if (NULL != pFile)
	{
		memset(persons,0,sizeof(persons));
		fseek(pFile,0L,SEEK_SET);
		fread(&persons,sizeof(Person),3,pFile);
		fclose(pFile);
		pFile = NULL;
		for(int i=0;i<=2;i++)
		{
			printf("姓名是%s\n",persons[i].name);
			printf("身高是%f\n",persons[i].height);
			printf("体重是%f\n\n",persons[i].weight);	
		}
	}
	return 0;
}


int fseek( FILE *stream, long offset, int origin );
  第一个参数stream为文件指针
  第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移
  第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
  SEEK_SET: 文件开头
  SEEK_CUR: 当前位置
  SEEK_END: 文件结尾
  其中SEEK_SET,SEEK_CUR和SEEK_END依次为0,1和2.
  简言之:
  fseek(fp,100L,0);把文件内部指针移动到离文件开头100字节处;
  fseek(fp,100L,1);把文件内部指针移动到离文件当前位置100字节处;
  fseek(fp,-100L,2);把文件内部指针退回到离文件结尾100字节处。
exit()和return的区别:
  按照ANSI C,在最初调用的main()中使用return和exit()的效果相同。
  但要注意这里所说的是“最初调用”。如果main()在一个递归程序中,exit()仍然会终止程序;但return将
  控制权移交给递归的前一级,直到最初的那一级,此时return才会终止程序。return和exit()的另一个区别
  在于,即使在除main()之外的函数中调用exit(),它也将终止程序。
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
  注意:这个函数以二进制形式对文件进行操作,不局限于文本文件
  返回值:返回实际写入的数据块数目
  (1)buffer:是一个指针,对fwrite来说,是要输出数据的地址;
  (2)size:要写入内容的单字节数;
  (3)count:要进行写入size字节的数据项的个数;
  (4)stream:目标文件指针;
  (5)返回实际写入的数据项个数count。
  说明:写入到文件的哪里? 这个与文件的打开模式有关,如果是w+,则是从file pointer指向的地址开始写,替换掉之后的内容,文件的长度可以不变,stream的位置移动count个数;如果是a+,则从文件的末尾开始添加,文件长度加大,而且是fseek函数对此函数没有作用。
函数原型:
  size_t fread(void *buffer, size_t size, size_t count, FILE *stream); 
  功 能:
  从一个文件流中读数据,读取count个元素,每个元素size字节.如果调用成功返回count.如果调用成功则实际读取size*count字节
  参 数:
  buffer
  用于接收数据的内存地址,大小至少是 size*count 字节.
  size
  单个元素的大小,单位是字节
  count
  元素的个数,每个元素是size字节.
  stream
  输入流
  返回值:
  实际读取的元素数.如果返回值与count(不是count*size)不相同,则可能文件结尾或发生错误.
  从ferror和feof获取错误信息或检测是否到达文件结尾.
http://blog.csdn.net/dongguxidu1/article/category/1243474

原文地址:https://www.cnblogs.com/lgh1992314/p/5835284.html