Почему я пишут больше, чем я говорю?
Вопрос
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?
Решение
Если вы находитесь в дозирующей системе (скажем, 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
данные или попробуйте открыть файл out как двоичный ("wb"
вместо "w"
).
Переменная write
является ненициализированным и, следовательно, размер массива и написанная сумма будет по сути случайным.
Интересно. Отлично работает на Windows VC ++, хотя ftello64
заменен ftell
.