#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