题
FILE *out=fopen64("text.txt","w+");
unsigned int write;
char *outbuf=new char[write];
//fill outbuf
printf("%i\n",ftello64(out));
fwrite(outbuf,sizeof(char),write,out);
printf("%i\n",write);
printf("%i\n",ftello64(out));
输出:
0
25755
25868
到底是怎么回事?写入设置为25755,我告诉fwrite将许多字节写入开始时的文件,然后在25755以外的位置上im?
解决方案
如果您在Dosish系统(例如Windows)上,并且该文件未在二进制模式下打开,则将自动转换线端,并且每个“行”都会添加一个字节。
因此,指定 "wb"
作为模式,而不是仅仅 "w"
正如@CAF指出的那样。它将对Unix这样的平台没有影响,并且会对他人做正确的事情。
例如:
#include <stdio.h>
#define LF 0x0a
int main(void) {
char x[] = { LF, LF };
FILE *out = fopen("test", "w");
printf("%d", ftell(out));
fwrite(x, 1, sizeof(x), out);
printf("%d", ftell(out));
fclose(out);
return 0;
}
使用VC ++:
C:\Temp> cl y.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. y.c Microsoft (R) Incremental Linker Version 9.00.21022.08 Copyright (C) Microsoft Corporation. All rights reserved. /out:y.exe C:\Temp> y.exe 04
与Cygwin GCC:
/cygdrive/c/Temp $ gcc y.c -o y.exe /cygdrive/c/Temp $ ./y.exe 02
其他提示
这可能取决于您打开文件的模式。如果将其作为文本文件打开,然后 \n
可以写为 \r\n
在DOS/Windows系统中。然而, ftello64()
可能只给出二进制文件指针,这将计入额外 \r
字符写。尝试清除 outbuf[]
任何 \n
数据或尝试以二进制打开输出文件("wb"
代替 "w"
).
变量 write
是非初始化的,因此阵列的大小和书面的数量本质上是随机的。
有趣的。在Windows VC ++上正常工作,尽管 ftello64
取代 ftell
.
不隶属于 StackOverflow