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以外的位置?
答案 0 :(得分:24)
如果您使用的是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;
}
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
/cygdrive/c/Temp $ gcc y.c -o y.exe /cygdrive/c/Temp $ ./y.exe 02
答案 1 :(得分:4)
可能取决于您打开文件的模式。如果将其作为文本文件打开,则\n
可能会在DOS / Windows系统中写为\r\n
。但是,ftello64()
可能只提供二进制文件指针,这将指向写入的额外\r
个字符。尝试清除所有outbuf[]
数据的\n
或尝试将文件打开为二进制文件("wb"
而不是"w"
)。
答案 2 :(得分:2)
变量write
未初始化,因此数组的大小和写入的数量基本上是随机的。
答案 3 :(得分:0)
有趣。在Windows VC ++上正常工作,尽管ftello64
已替换为ftell
。