Solved

fopen with fscanf in C

Posted on 2007-03-19
4
1,524 Views
Last Modified: 2012-08-13
I want to read  some data from a file into a data structure, how can I use the scanf function and do error checking?

For example -
FILE *fp;
fp = fopen(filename, "r");
Entry entry = new Entry();
if (fp == NULL)
    {
      fprintf(stderr, "Error: Unable to open file %s\n\n", string);
      return FALSE;
    }
   
 //while( (ch=getc(fptr)) != EOF )
***Normally I would try to get each character and see if I reach the end of file, but if I want to use fscanf, how should I detect the eof?***
***Also, what about if there is error in the input file?  For example, If I am expecting a pattern like john, smith, 1/1/2000, john.smith@email.com
***I would like to know how I can detect fields missing or corrupted error with scanf?

              fscanf(fp, "%s,%s,%s,%s", entry.firstName, entry.lastName,
            entry.DOB, entry.email);

Look forward to hear from you
      
0
Comment
Question by:4eyesgirl
  • 2
4 Comments
 
LVL 24

Expert Comment

by:fridom
Comment Utility
You can do as in the getch loop

while((fscanf(fp, fmt_string, args...) != EOF)

However you must check the return value, because on read failure (for whatever reason EOF is returned), however it might be a different problem so you have to check errno too if you want to be on the safe side.

Regards
Friedrich
0
 
LVL 53

Expert Comment

by:Infinity08
Comment Utility
>> ***I would like to know how I can detect fields missing or corrupted error with scanf?

The return value of fscanf() contains the number of successfully read fields. So, if you're expecting 3 fields, and fscanf() returns 2, then you know that there's a problem in the record.

Similarly, when the end of the file is met before fscanf could read any data, EOF is returned.


More information :

http://www.cplusplus.com/reference/clibrary/cstdio/fscanf.html
0
 

Author Comment

by:4eyesgirl
Comment Utility

char* firstName = (char*) malloc(MAX_LEN);
char* lastName = (char*) malloc(MAX_LEN);
char* DOB = (char*) malloc(MAX_LEN);
char* email= (char*) malloc(MAX_LEN);

when I try to use
while( (fscanf(fp, "%s,%s,%s,%s", firstName, lastName,
            DOB, email) != EOF)) {
//....does not work
// firstName -> read the entire line.  Doesn't looks like fscanf separate with then input format that I provided.
}

however, using space works, why?
while( (fscanf(fp, "%s %s %s %s", firstName, lastName,
            DOB, email) != EOF)) {
//....
}

I don't want to change my file format.  My file format is firstname,lastname,dob,email
Please help!
0
 
LVL 53

Accepted Solution

by:
Infinity08 earned 500 total points
Comment Utility
Try something like this :

  char *buff = (char*) malloc(MAX_LEN * 4 + 5);

  /* ... */

  while (fgets(buff, MAX_LEN * 4 + 5, fp)) {
    if (sscanf(buff, "%[^,],%[^,],%[^,],%[^,\n]\n", firstName, lastName, DOB, email) != 4) continue;

    fprintf(stdout, "firstName : %s\n", firstName);
    fprintf(stdout, "lastName : %s\n", lastName);
    fprintf(stdout, "DOB : %s\n", DOB);
    fprintf(stdout, "email : %s\n", email);
    fprintf(stdout, "\n");
  }

The (MAX_LEN * 4 + 5) is the maximum allowed length of a line based on MAX_LEN.

Note that I also filtered out invalid lines by checking the return value of sscanf.
0

Featured Post

How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
memory leak detection 9 51
Goodbye, so long 10 91
Is string constant address ? 10 189
Which version of C should I use when Perl is too slow? 13 165
Preface I don't like visual development tools that are supposed to write a program for me. Even if it is Xcode and I can use Interface Builder. Yes, it is a perfect tool and has helped me a lot, mainly, in the beginning, when my programs were small…
This tutorial is posted by Aaron Wojnowski, administrator at SDKExpert.net.  To view more iPhone tutorials, visit www.sdkexpert.net. This is a very simple tutorial on finding the user's current location easily. In this tutorial, you will learn ho…
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use for-loops in the C programming language.
The goal of this video is to provide viewers with basic examples to understand and use conditional statements in the C programming language.

728 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now