Почему написано больше, чем я говорю?

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, чтобы записать, что много байтов в файл, который находится в начале, а затем im в позиции, кроме 25755?

Ответ 1

Если вы находитесь в системе 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;
}

С VС++:

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

Ответ 2

Это может зависеть от режима, в котором вы открыли файл. Если вы откроете его как текстовый файл, тогда \n может быть записано как \r\n в системах DOS/Windows. Тем не менее, ftello64(), вероятно, дает только двоичный указатель файла, который будет учитываться в дополнительных символах \r. Попробуйте очистить outbuf[] от любых данных \n или попробуйте открыть файл out как двоичный ("wb" вместо "w").

Ответ 3

Переменная write неинициализирована, поэтому размер массива и записанная сумма будут по существу случайными.

Ответ 4

Интересно. Хорошо работает в Windows VС++, хотя ftello64 заменен на ftell.