如果length比原来的小,则在截断文件
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> int main() { int fd; struct stat st; fd = open("stu.dat",O_RDWR); fstat(fd,&st); //错误:存储大小未知 没加头文件 printf("%d,%o\n",(int)st.st_size,st.st_mode); //72 100644 ftruncate(fd,st.st_size+1000); // 需要写权限才能改变大小 fstat(fd,&st); printf("%d\n",(int)st.st_size); close(fd); }
mmap /munmap
之前介绍过(http://blog.csdn.net/a8887396/article/details/8996213) ,写的是内存映射,拷过来
void *mmap(
void *start, //指定映射的虚拟地址 如为0 系统指定开始位置
size_t length, //映射的空间大小 : pagesize倍数
int prot,//映射权限 PROT_NONE PROT_READ PROT_WRITE PROT_EXEC
int flags,//映射方式
int fd,//文件描述符
offset_t off); //文件中的偏移位置(必须是page_size的倍数)
int munmap(void *addr, size_t length);
映射方式:
内存映射:匿名映射
文件映射:映射到文件 ,只有当文件映射时,最后两个参数才有效
MAP_ANONYMOUS 写了就是内存映射 不写就是文件映射
MAP_PRIVATE MAP_SHARED 2选1
umap(void *start,size_t lenth)
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <sys/mman.h> struct stu { char name[20]; int age; float score; }; int main() { //打开文件 //增加文件大小 //映射到虚拟地址 //把数据写入虚拟地址 //卸载虚拟地址 //关闭文件 int fd = open("newstu.dat",O_RDWR|O_CREAT,0666); if(fd < 0) { perror("open error"); return 1; } struct stat st; fstat(fd,&st); int size = st.st_size ; //文件大小 int count = size/sizeof(struct stu);//记录条数 //因为要增加数据 所以要先增加文件大小(很重要) ftruncate(fd,size+sizeof(struct stu)); //增加文件大小 //将文件映射到内存的虚拟地址,得到文件在虚拟内存中映射的首地址 struct stu*s= mmap(0, size+sizeof(struct stu), PROT_WRITE|PROT_READ, MAP_SHARED, fd,0); printf("请输入学生姓名"); scanf("%s",s[count].name); printf("请输入学生年龄"); scanf("%d",&s[count].age); printf("请输入学生成绩"); scanf("%f",&s[count].score); munmap(s,size+sizeof(struct stu)); close(fd); }
2使用内存方式读取数据
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <sys/mman.h> struct stu { char name[20]; int age; float score; }; int main() { int fd = open("newstu.dat",O_RDWR); if(fd < 0) { perror("open fail"); return 1; } struct stat st; fstat(fd,&st); int size = st.st_size; int count = size/sizeof(struct stu); struct stu*s = mmap(0,size,PROT_READ | PROT_WRITE, MAP_SHARED,fd,0); if(s < 0) { perror("mmap error"); return 1; } int i =0; for(; i<count ;i++) { printf("name:%s,age:%d,score:%.2f\n",s[i].name,s[i].age,s[i].score); } munmap(s,size); close(fd); }