Human Cyborg Relations
Human Cyborg Relations

Reputation: 1244

Reading and writing files in C isn't giving correct output

I've got an input file, of the following format:

C G F 0.89402944 I -628131597 C U F 0.8987373 C F C N F 0.046165943 C K I -898862630 F 0.20252013 I -1074797352 F 0.11681563 F 0.88717264 F 0.7676326 I -817826750

The objective is to create 3 new files. One file will contain characters, the other will contain ints, and the third will contain floats.

I'm supposed to read the input file by first reading the first character. This character will tell me what the next string is. So, for example, the first character is C, this means that the next sequence of characters will be a Char. Then I read the next character, which is an F, which means that the next sequence of characters will be a float, and so on.

#include<stdio.h>

int main(int arg, char * argv[]){
FILE * intsFile = fopen("ints.txt", "w");
FILE * charsFile = fopen("chars.txt", "w");
FILE * floatsFile = fopen("floats.txt", "w");

FILE * inputFile = fopen("input.txt", "r");

char characters;
int integers;
float floats;

char flag;

while(fscanf(inputFile, "%c", &flag) != EOF){
    if (flag == 'C'){
        fscanf(inputFile, "%c", &characters);
        fprintf(charsFile, "%c ", characters);
    }
    if (flag == 'F'){
        fscanf(inputFile, "%i", &integers);
        fscanf(inputFile, "%i ", integers);
    }
    if (flag == 'I'){
        fscanf(inputFile, "%f", &floats);
        fscanf(inputFile, "%f ", floats);
    }
}

return 0;
}

However, my output is weird. I get nothing in my chars.txt file, nothing in my ints file, and my floats file contains a duplicate value. Whats going on here?

Upvotes: 1

Views: 105

Answers (2)

koksalb
koksalb

Reputation: 431

Your loops were a bit wrong, flag==F was reading integers and also integer and float reads were trying to write to the input file. Your main problem was the SPACES between characters and numbers, which can be fixed with scanf being " %c" etc as shown below. Here is the complete working code.

#include<stdio.h>

int main(int arg, char * argv[]){
    FILE * intsFile = fopen("ints.txt", "w");
    FILE * charsFile = fopen("chars.txt", "w");
    FILE * floatsFile = fopen("floats.txt", "w");

    FILE * inputFile = fopen("input.txt", "r");

    char characters;
    int integers;
    float floats;

    char space;

    char flag;

    while (fscanf(inputFile, "%c ", &flag) != EOF){
        if (flag == 'C'){

            fscanf(inputFile, "%c", &characters);
            fprintf(charsFile, "%c ", characters);

        }
        if (flag == 'F'){
            fscanf(inputFile, "%f", &floats);
            fprintf(floatsFile, "%f ", floats);

        }
        if (flag == 'I'){

            fscanf(inputFile, "%i", &integers);
            fprintf(intsFile, "%i", integers);

        }
        fscanf(inputFile, "%c", &space);
    }

    return 0;
}

Upvotes: 1

aldarel
aldarel

Reputation: 456

You can fix it with following code:

#include<stdio.h>

int main(int arg, char * argv[]){
    FILE * intsFile = fopen("ints.txt", "wt");
    FILE * charsFile = fopen("chars.txt", "wt");
    FILE * floatsFile = fopen("floats.txt", "wt");

    FILE * inputFile = fopen("input.txt", "r");

    char characters;
    int integers;
    float floats;

    char flag;

    while(fscanf(inputFile, "%c", &flag) != EOF){
        if (flag == 'C'){
            fscanf(inputFile, " %c", &characters); //fix
            fprintf(charsFile, "%c ", characters);
        }
        if (flag == 'F'){
            fscanf(inputFile, "%f", &floats);//fix. wrong order with integer
            fprintf(floatsFile, "%f ", floats);//fix
        }
        if (flag == 'I'){
            fscanf(inputFile, "%i", &integers);//fix. wrong order with float
            fprintf(intsFile, "%i ", integers);//fix
        }
    }

    fclose(intsFile);//fixes
    fclose(charsFile);
    fclose(floatsFile);
    fclose(inputFile);

    return 0;
}

Upvotes: 1

Related Questions