在编写二进制文件时遇到问题。为了调试该问题,我通过调用setbuf(pf,0)
使输出文件流不受缓冲。以下是代表问题的代码的一部分。在致电fwrite
之前,请pos0=943195
。通过调用fwrite
,我在文件中写入了一个整数。但是,在致电fwrite
之后,pos=943200
应该是 943199 。
FILE* pf = NULL;
pfSenc = fopen(szFilePath,"r+b");
setbuf(pfSenc,0);
// lots of read and write operations on this file
int pos0 = ftell(pf);
fwrite(&some_num,sizeof(int),1,pf);
int pos = ftell(pf);
// more read and write operations on this file.
fclose(pf);
在Solaris OS中写入二进制文件时,这是某种对齐要求吗?由于943195不能除以4,所以fwrite
从943196开始?写入文件的内容还显示fwrite以1个字节的偏移量开始写入。如果是对齐问题,可以以某种方式禁用此功能吗?该代码可以在Windows和Centos7等其他操作系统中正常工作。
更新: 以下系统调用:
1334: llseek(18,SEEK_CUR) = 943195
1334: write(18,"B1",1) = 1
1334: write(18," !CC13\0",4) = 4
1334: llseek(18,SEEK_CUR) = 943200
由以下三行代码生成:
int pos0 = ftell(pf);
fwrite(&some_num,pf);
int pos = ftell(pf);
在写入int编号之前,有一个意外的额外写入调用:
1334: write(18,1) = 1
我不知道这个电话来自哪里?该应用程序是单线程的,在其他任何地方都不会打开该文件。