问题
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));
output:
0
25755
25868
what is going on? write is set to 25755, and I tell fwrite to write that many bytes to a file, which is at the beginning, and then im at a position besides 25755?
回答1:
If you are on a DOSish system (say, Windows) and the file is not opened in binary mode, line-endings will be converted automatically and each "line" will add one byte.
So, specify "wb"
as the mode rather than just "w"
as @caf points out. It will have no effect on Unix like platforms and will do the right thing on others.
For example:
#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;
}
With 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
With Cygwin gcc:
/cygdrive/c/Temp $ gcc y.c -o y.exe /cygdrive/c/Temp $ ./y.exe 02
回答2:
It may depend on the mode in which you opened the file. If you open it as a text file, then \n
may be written as \r\n
in DOS/Windows systems. However, ftello64()
probably only gives the binary file pointer, which would count in the extra \r
characters written. Try clearing the outbuf[]
of any \n
data or try opening the out file as binary ("wb"
instead of "w"
).
回答3:
The variable write
is uninitialized and so the size of the array and the amount written will be essentially random.
回答4:
Interesting. Works fine on Windows VC++, albeit ftello64
replaced with ftell
.
来源:https://stackoverflow.com/questions/1586421/why-is-fwrite-writing-more-than-i-tell-it-to