Pregunta

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));

producción:

0
25755
25868

¿Que esta pasando? Escribir está establecido en 25755, y le digo a FWrite que escriba tantos bytes en un archivo, que es al principio, y luego estoy en una posición además de 25755?

¿Fue útil?

Solución

Si está en un sistema de dosis (por ejemplo, Windows) y el archivo no se abre en modo binario, las extremidades de línea se convertirán automáticamente y cada "línea" agregará un byte.

Entonces, especifique "wb" como el modo en lugar de solo "w" Como señala @CAF. No tendrá ningún efecto en las plataformas como UNIX y hará lo correcto en los demás.

Por ejemplo:

#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;
}

Con 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

Con Cygwin GCC:

/cygdrive/c/Temp $ gcc y.c -o y.exe

/cygdrive/c/Temp $ ./y.exe
02

Otros consejos

Puede depender del modo en el que abrió el archivo. Si lo abre como un archivo de texto, entonces \n puede ser escrito como \r\n en sistemas DOS/Windows. Sin embargo, ftello64() probablemente solo proporciona el puntero de archivo binario, lo que contaría en el extra \r personajes escritos. Intenta limpiar el outbuf[] de cualquier \n datos o intente abrir el archivo de salida como binario ("wb" en vez de "w").

La variable write no está inicializado y, por lo tanto, el tamaño de la matriz y la cantidad escrita será esencialmente aleatoria.

Interesante. Funciona bien en Windows VC ++, aunque ftello64 reemplazadas con ftell.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top