为什么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