如下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链接: