Why is fwrite writing more than I tell it to?

前端 未结 4 700
无人及你
无人及你 2020-12-18 21:21
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),w         


        
相关标签:
4条回答
  • 2020-12-18 21:52

    The variable write is uninitialized and so the size of the array and the amount written will be essentially random.

    0 讨论(0)
  • 2020-12-18 21:54

    If you are on a DOSish system (say, Windows) and the file is not opened in binary mode, line-endings will be converted automatically and each "line" will add one byte.

    So, specify "wb" as the mode rather than just "w" as @caf points out. It will have no effect on Unix like platforms and will do the right thing on others.

    For example:

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

    With 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
    

    With Cygwin gcc:

    /cygdrive/c/Temp $ gcc y.c -o y.exe
    
    /cygdrive/c/Temp $ ./y.exe
    02
    
    0 讨论(0)
  • 2020-12-18 22:11

    It may depend on the mode in which you opened the file. If you open it as a text file, then \n may be written as \r\n in DOS/Windows systems. However, ftello64() probably only gives the binary file pointer, which would count in the extra \r characters written. Try clearing the outbuf[] of any \n data or try opening the out file as binary ("wb" instead of "w").

    0 讨论(0)
  • 2020-12-18 22:17

    Interesting. Works fine on Windows VC++, albeit ftello64 replaced with ftell.

    0 讨论(0)
提交回复
热议问题