📄 p10-11.c
字号:
#include <unistd.h>#include <stdio.h>#include <sys/mman.h>#define NRECORDS (100)typedef struct { int integer; char string[24];} RECORD;int main(void){ RECORD record, *mapped; int i,f; FILE *fp; fp = fopen("records.dat","w+"); /* 写记录至文件 */ for (i=0;i<NRECORDS;i++){ record.integer = i; sprintf(record.string, "RECORD-%d", i); fwrite(&record,sizeof(record),1,fp); } fclose(fp); /* 重新打开此文件用通常的方法修改第43个记录 */ fp = fopen("records.dat","r+"); fseek(fp, 43*sizeof(record), SEEK_SET); /* 定位文件位置于第43个记录处 */ fread(&record, sizeof(record),1, fp); /* 读出该记录 */ record.integer = 143; /* 修改记录号 */ sprintf(record.string, "RECORD-%d",record.integer); fseek(fp,43*sizeof(record),SEEK_SET); /* 再次定位文件位置于第43个记录处 */ fwrite(&record,sizeof(record),1,fp); /* 将修改后的记录写回文件 */ fclose(fp); /* 重新打开此文件用存储映射方法修改第43个记录 */ f = open("records.dat",O_RDWR); /* 将文件的前NRECORDS个记录映射到内存 */ mapped = (RECORD *)mmap(0, NRECORDS*sizeof(record), PROT_READ|PROT_WRITE,MAP_SHARED, f, 0); mapped[43].integer = 243; /* 修改第43个记录的记录号 */ sprintf(mapped[43].string, "RECORD-%d",mapped[43].integer); msync((void*)mapped, NRECORDS*sizeof(record), MS_ASYNC); munmap((void*)mapped, NRECORDS*sizeof(record)); /* 删除存储映射 */ /*查看文件有否改变 */ lseek(f, 43*sizeof(record), SEEK_SET); read(f, &record, sizeof(record)); printf("record[43].integer = %d\n",record.integer); close(f); exit(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -