文件流操作时注意文件打开模式和缓冲区影响

        如下demo,文件打开模式和缓冲区影响。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/time.h>

#define TEST_FILE "/home/yihelsc/testfile.bin"
#define TEST_DATA 0x5A
#define TEST_LEN 0x100000
#define TEST_LOOP 100

int FileWrite(unsigned long offset, unsigned char *buf, unsigned int len)
{
	FILE *file = fopen(TEST_FILE, "r+");
	if (file == NULL) {
		return -1;
	}

	if (fseek(file, offset, SEEK_SET)) {
		fclose(file);
		return -1;
	}

	size_t wrSize = fwrite(buf, sizeof(unsigned char), len, file);
	fclose(file);
	if (wrSize != len) {
		return -1;
	}

	return 0;
}

void TestWriteFile()
{
	unsigned char *buf = (unsigned char *)malloc(TEST_LEN);
	if (buf == NULL) {
		return;
	}

	memset(buf, TEST_DATA, TEST_LEN);

	FILE *file = fopen(TEST_FILE, "w+");
	fclose(file);
	for (unsigned int i = 0; i < TEST_LOOP; i++) {
		FileWrite(i * TEST_LEN, buf, TEST_LEN);
	}

	return;
}

int main()
{
    TestWriteFile();
    return 0;
}

        对于多次fseek+fwrite的文件写入,使用r+而不是w+,因为w+会将历史写入文件的数据清楚。结果就是只有最后一次的保留下来了,最后一次fseek之前的数据全部变成0。

        demo中每次fwrite完都close掉,下次fwrite重新fopen,有效率低下的嫌疑。但时对于慢速存储设备格外重要,fwrite时写入缓冲区,并不会直接写入设备,fclose可以确保已经写入设备,在时序要求比较严格的情况下,需要每次fclose确保数据写入。

gitcode链接:

GitCode - 全球开发者的开源社区,开源代码托管平台

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值