Search code examples
ctext-filesbinaryfilesfile-handling

Why is the file storing binary characters? getw() and putw() were asked to be used in the question


I've used a ".txt" extension while reading and writing the file, also the file mode is corresponding to that of "text" type of file. The program runs fine, but instead of storing an ASCII character in the file, it is storing binary characters. I need some assistance here. Thank you. enter image description here

int main(void)
{
    FILE *fp;
    int n2, n1;
    printf("ENTER A NUMBER: ");
    scanf("%d", &n1);
    fp = fopen("hello.txt", "w");
    if (fp == NULL)
    {
        printf("ERROR");
        exit(1);
    }
    fprintf(fp, "%d", n1);
    //fclose(fp);
    //rewind(fp);
    fp = fopen("hello.txt", "r");
    if (fp == NULL)
    {
        printf("ERROR");
        exit(1);
    }
    //n2 = getw(fp);
    fscanf(fp, "%d", n1);
    printf("%d", n1);
    fclose(fp);
}

Solution

  • If you are going to close and reopen the file you don't need rewind. Or you can open the file to read and write, and then you can use rewind. Both work, here is a sample of the latter:

    int main(void)
    {
        FILE *fp;
        int n2, n1;
        printf("ENTER A NUMBER: ");
        if (scanf("%d", &n1) == 1) // checking if the input was correctly parsed
        {
            fp = fopen("hello.txt", "w+"); // open to read and write
            if (fp == NULL)
            {
                printf("ERROR");
                exit(1);
            }
            putw(n1, fp); // write to the file
    
            rewind(fp); // go back to the beginning of the file
    
            n2 = getw(fp);    // get the data
    
            printf("%d", n2);
            fclose(fp);
        }
        else
        {
            puts("Bad input");
        }
    }
    

    Live sample

    There is still the matter of possible integer overflow when reading from stdin, if there is no requirement to guard against that, make sure to at least document the vulnerability, otherwise the advice is to use fgets to read input and strtol to convert the value.