Read the entire contents of a file to c char *, including new lines

后端 未结 4 1888
孤城傲影
孤城傲影 2021-01-25 13:53

I\'m looking for a cross platform (Windows + Linux) solution to reading the contents of an entire file into a char *.

This is what I\'ve got now:



        
相关标签:
4条回答
  • 2021-01-25 13:55

    The function fread will read from the stream and not terminate on end-of-line characters.

    From the man page, you have:

    size_t fread(void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);
    

    which reads in nitems of size size.

    0 讨论(0)
  • 2021-01-25 14:06

    Something like this, may be?

    FILE *stream;
    char *contents;
    fileSize = 0;
    
    //Open the stream. Note "b" to avoid DOS/UNIX new line conversion.
    stream = fopen(argv[1], "rb");
    
    //Seek to the end of the file to determine the file size
    fseek(stream, 0L, SEEK_END);
    fileSize = ftell(stream);
    fseek(stream, 0L, SEEK_SET);
    
    //Allocate enough memory (add 1 for the \0, since fread won't add it)
    contents = malloc(fileSize+1);
    
    //Read the file 
    size_t size=fread(contents,1,fileSize,stream);
    contents[size]=0; // Add terminating zero.
    
    //Print it again for debugging
    printf("Read %s\n", contents);
    
    //Close the file
    fclose(stream);
    free(contents);
    
    0 讨论(0)
  • 2021-01-25 14:20

    fread reads all the files as-is:

     if (fread(contents, 1, fileSize, stream) != fileSize) {
        /* error occurred */
     }
    
    0 讨论(0)
  • 2021-01-25 14:20

    I've got this:

    ssize_t filetomem(const char *filename, uint8_t **result)
    { 
        ssize_t size = 0;
        FILE *f = fopen(filename, "r");
        if (f == NULL) 
        { 
            *result = NULL;
            return -1;
        } 
        fseek(f, 0, SEEK_END);
        size = ftell(f);
        fseek(f, 0, SEEK_SET);
        *result = malloc(size);
        if (size != fread(*result, sizeof(**result), size, f)) 
        { 
            free(*result);
            return -2;
        } 
    
        fclose(f);
        return size;
    }
    

    Meaning of return value:

    • Positive or 0: successfully read the file
    • minus one: couldn't open file (possibly no such file)
    • minus two: fread() failed
    0 讨论(0)
提交回复
热议问题