版权声明:吸猫大法、 https://blog.csdn.net/sasuke__/article/details/79510535
写了下Linux程序设计那本书中第三章的例子、
#include<unistd.h>
#include<stdio.h>
#include<sys/mman.h>
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>
typedef struct {
int interger;
char string[24];
} RECORD;
#define NRECORDS (100)
int main () {
RECORD record, *mapped;
int i, f;
FILE *fp;
fp = fopen("records.dat", "w+b");
for (i = 0; i < NRECORDS; ++i) {
//memset(record, 0, sizeof(record));
record.interger = i;
memset(record.string, 0, sizeof(record.string));
sprintf(record.string, "RECORD-%d", i);
// printf("%d %s\n", record.interger, record.string);
fwrite(&record, sizeof(record), 1, fp);
}
rewind(fp);
RECORD dushuai[NRECORDS];
fread(dushuai, sizeof(record), NRECORDS, fp);
for (i = 0; i < NRECORDS; ++i) {
printf("%d %s\n", dushuai[i].interger, dushuai[i].string);
}
// pid_t pid;
// pid = fork();
// if (pid == 0) {
// execlp("cat", "cat", "./records.dat", NULL);
// exit(0);
// }
fclose(fp);
fp = fopen("records.dat", "r+");
fseek(fp, 43 * sizeof(record), SEEK_SET);
fread(&record, sizeof(record), 1, fp);
record.interger = 143;
sprintf(record.string, "RECORD-%d", record.interger);
fseek(fp, 43 * sizeof (record), SEEK_SET);
fwrite(&record, sizeof(record), 1, fp);
fclose(fp);
f = open("records.dat", O_RDWR);
mapped = (RECORD *) mmap (0, NRECORDS * sizeof(record), PROT_READ | PROT_WRITE , MAP_SHARED, f , 0);
mapped[43].interger = 243;
sprintf(mapped[43].string, "RECORD-%d", mapped[43].interger);
msync((void *)mapped, NRECORDS * sizeof (record), MS_ASYNC);
munmap((void *)mapped, NRECORDS * sizeof (record));
close(f);
return 0;
}
程序执行没问题,使用fread读取的数据也没问题
但是当我打开文件时发现文件并不是我所想的那样,有乱码的现象
我本以为会按这种形式输出
printf("%d %s\n", record.interger, record.string);
类似于上面这种代码的执行结果
后来查了下原来fwrite写的时候是按二进制写进文件里面去的
也就是当时内存空间二进制数是什么就原样输出到文件
针对这个信息我又去查看了下records.dat文件的大小
发现确实是这么大
Size 确实是2800
因为一个结构体变量的大小就是28B 所以100个就是2800
如果按我想的输出结果肯定没有这么大
目前我了解的解决这种问题的方法是用sprintf来格式化输出到文件