Почему написано больше, чем я говорю?
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
.