Search code examples
cfiletext-files

In C, how should I read a text file and print all strings


I have a text file named test.txt

I want to write a C program that can read this file and print the content to the console (assume the file contains only ASCII text).

I don't know how to get the size of my string variable. Like this:

char str[999];
FILE * file;
file = fopen( "test.txt" , "r");
if (file) {
    while (fscanf(file, "%s", str)!=EOF)
        printf("%s",str);
    fclose(file);
}

The size 999 doesn't work because the string returned by fscanf can be larger than that. How can I solve this?


Solution

  • The simplest way is to read a character, and print it right after reading:

    int c;
    FILE *file;
    file = fopen("test.txt", "r");
    if (file) {
        while ((c = getc(file)) != EOF)
            putchar(c);
        fclose(file);
    }
    

    c is int above, since EOF is a negative number, and a plain char may be unsigned.

    If you want to read the file in chunks, but without dynamic memory allocation, you can do:

    #define CHUNK 1024 /* read 1024 bytes at a time */
    char buf[CHUNK];
    FILE *file;
    size_t nread;
    
    file = fopen("test.txt", "r");
    if (file) {
        while ((nread = fread(buf, 1, sizeof buf, file)) > 0)
            fwrite(buf, 1, nread, stdout);
        if (ferror(file)) {
            /* deal with error */
        }
        fclose(file);
    }
    

    The second method above is essentially how you will read a file with a dynamically allocated array:

    char *buf = malloc(chunk);
    
    if (buf == NULL) {
        /* deal with malloc() failure */
    }
    
    /* otherwise do this.  Note 'chunk' instead of 'sizeof buf' */
    while ((nread = fread(buf, 1, chunk, file)) > 0) {
        /* as above */
    }
    

    Your method of fscanf() with %s as format loses information about whitespace in the file, so it is not exactly copying a file to stdout.