fopen、fwrite、fread理解

版权声明:吸猫大法、 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来格式化输出到文件




猜你喜欢

转载自blog.csdn.net/sasuke__/article/details/79510535