为什么fwrite的写作比我说的要多?
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
到底是怎么回事? write设置为25755,我告诉fwrite将多个字节写入文件,这是在开头,然后我在25755以外的位置?
如果您使用的是DOSish系统(例如,Windows)并且文件未以二进制模式打开,则行结尾将自动转换,每个“行”将添加一个字节。
因此,指定"wb"
作为模式而不仅仅是"w"
因为@caf指出。 它对Unix平台没有任何影响,并且会对其他人做正确的事情。
例如:
#include #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 yc 用于80x86的Microsoft(R)32位C / C ++优化编译器版本15.00.21022.08 版权所有(C)Microsoft Corporation。 版权所有。 YC Microsoft(R)增量链接器版本9.00.21022.08 版权所有(C)Microsoft Corporation。 版权所有。 /out:y.exe C:\ Temp> y.exe 04
使用Cygwin gcc:
/ cygdrive / c / Temp $ gcc yc -o y.exe / cygdrive / c / Temp $ ./y.exe 02
它可能取决于您打开文件的模式。 如果将其作为文本文件打开,则\n
可以在DOS / Windows系统中写为\r\n
。 但是, ftello64()
可能只提供二进制文件指针,该指针将计入额外的\r
字符。 尝试清除任何\n
数据的outbuf[]
或尝试将输出文件打开为二进制( "wb"
而不是"w"
)。
变量write
是未初始化的,因此数组的大小和写入的数量基本上是随机的。
有趣。 在Windows VC ++上正常工作,尽管ftello64
替换为ftell
。