19

I need to read and print data from a file.
I wrote the program like below,

#include<stdio.h>
#include<conio.h>
int main(void)
{
char item[9], status;

FILE *fp;

if( (fp = fopen("D:\\Sample\\database.txt", "r+")) == NULL)
{
    printf("No such file\n");
    exit(1);
}  

 if (fp == NULL)
{
    printf("Error Reading File\n");
}

while(fscanf(fp,"%s %c",item,&status) == 1)  
{  
       printf("\n%s \t %c", item,status);  
}  
if(feof(fp))  
{            
         puts("EOF");     
}  
else  
{  
 puts("CAN NOT READ");  
}  
getch();  
return 0;  
}  

the database.txt file contains
Test1 A
Test2 B
Test3 C

When I run the code, it prints

CAN NOT READ.

Please help me to find out the problem.

Guru
  • 207
  • 2
  • 4
  • 8

4 Answers4

28

First of all, you're testing fp twice. so printf("Error Reading File\n"); never gets executed.

Then, the output of fscanf should be equal to 2 since you're reading two values.

Hamid Nazari
  • 3,905
  • 2
  • 28
  • 31
13

scanf() and friends return the number of input items successfully matched. For your code, that would be two or less (in case of less matches than specified). In short, be a little more careful with the manual pages:

#include <stdio.h>
#include <errno.h>
#include <stdbool.h>

int main (void) {
    FILE *fp;

    if ((fp = fopen("D:\\Sample\\database.txt", "r+")) == NULL) {
        puts("No such file\n");
        exit(1);
    }

    char item[9], status;
    while (true) {
        int ret = fscanf(fp, "%s %c", item, &status);
        if (ret == 2)
            printf("\n%s \t %c", item, status);
        else if (errno != 0) {
            perror("scanf:");
            break;
        } else if(ret == EOF) {
            break;
        } else {
            puts("No or partial match.\n");
        }
    }
    puts("\n");
    if (feof(fp)) {
        puts("EOF");
    }
    return 0;
}
Michael Foukarakis
  • 39,737
  • 6
  • 87
  • 123
3

In your code:

while(fscanf(fp,"%s %c",item,&status) == 1)  

why 1 and not 2? The scanf functions return the number of objects read.

1

fscanf will treat 2 arguments, and thus return 2. Your while statement will be false, hence never displaying what has been read, plus as it has read only 1 line, if is not at EOF, resulting in what you see.

Didier Trosset
  • 36,376
  • 13
  • 83
  • 122