Вопрос

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top