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.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top