#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.youkuaiyun.com/dongguxidu1/article/category/1243474