Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > can fscanf skip reading data conditionally?

Reply
Thread Tools

can fscanf skip reading data conditionally?

 
 
John
Guest
Posts: n/a
 
      09-27-2006
I need to read data from the file like the following with name and
score, but some line may only has name without score:

joe 100
amy 80
may

Here's my code, but it couldn't read the line with "may" because there
is no score. Anyone knows what is the workaround to this problem?

char name[20];
int score;

while (fscanf(ifp, "%s %d", name, &score) == 2)
{
printf("%s %d\n", name, score);
}


please advice. thanks!!

 
Reply With Quote
 
 
 
 
Fred Kleinschmidt
Guest
Posts: n/a
 
      09-27-2006

"John" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed) ps.com...
>I need to read data from the file like the following with name and
> score, but some line may only has name without score:
>
> joe 100
> amy 80
> may
>
> Here's my code, but it couldn't read the line with "may" because there
> is no score. Anyone knows what is the workaround to this problem?
>
> char name[20];
> int score;
>
> while (fscanf(ifp, "%s %d", name, &score) == 2)
> {
> printf("%s %d\n", name, score);
> }
>


What makes you think it couldn't read the line?
I'll bet it did it just fine, and returned 1.

>
> please advice. thanks!!
>

--
Fred L. Kleinschmidt
Boeing Associate Technical Fellow
Technical Architect, Software Reuse Project


 
Reply With Quote
 
 
 
 
Robert Gamble
Guest
Posts: n/a
 
      09-27-2006
John wrote:
> I need to read data from the file like the following with name and
> score, but some line may only has name without score:
>
> joe 100
> amy 80
> may
>
> Here's my code, but it couldn't read the line with "may" because there
> is no score. Anyone knows what is the workaround to this problem?
>
> char name[20];
> int score;
>
> while (fscanf(ifp, "%s %d", name, &score) == 2)
> {
> printf("%s %d\n", name, score);
> }


int i;
while ((i = fscanf(ifp, "%s %d", name, &score)) >= 1)
{
if (i == 2)
printf("%s %d\n", name, score);
else
printf("%s\n", name);
}

Robert Gamble

 
Reply With Quote
 
Michael Mair
Guest
Posts: n/a
 
      09-27-2006
John wrote:
> I need to read data from the file like the following with name and
> score, but some line may only has name without score:
>
> joe 100
> amy 80
> may
>
> Here's my code, but it couldn't read the line with "may" because there
> is no score. Anyone knows what is the workaround to this problem?
>
> char name[20];
> int score;
>
> while (fscanf(ifp, "%s %d", name, &score) == 2)
> {
> printf("%s %d\n", name, score);
> }


You did not specify what you want to do if you encounter this problem.
One example:

char name[20];
int score;
int ret;

while (EOF != (ret = fscanf(ifp, "%19s %d", name, &score)))
{
if (ret > 0) {
printf("%s", name);
if (ret > 1) {
printf("%d", score);
}
}
putchar('\n');
}

Next time, explain what you want to do, what you have, how the
results of your code do not match what you expected, and give
a compilable minimal example. This helps us help you.


Cheers
Michael
--
E-Mail: Mine is an /at/ gmx /dot/ de address.
 
Reply With Quote
 
Keith Thompson
Guest
Posts: n/a
 
      09-27-2006
"Robert Gamble" <(E-Mail Removed)> writes:
> John wrote:
>> I need to read data from the file like the following with name and
>> score, but some line may only has name without score:
>>
>> joe 100
>> amy 80
>> may
>>
>> Here's my code, but it couldn't read the line with "may" because there
>> is no score. Anyone knows what is the workaround to this problem?
>>
>> char name[20];
>> int score;
>>
>> while (fscanf(ifp, "%s %d", name, &score) == 2)
>> {
>> printf("%s %d\n", name, score);
>> }

>
> int i;
> while ((i = fscanf(ifp, "%s %d", name, &score)) >= 1)
> {
> if (i == 2)
> printf("%s %d\n", name, score);
> else
> printf("%s\n", name);
> }


fscanf() skips whitespace, including newlines. If you call fscanf
with a format of "%s %d", it will read a blank delimited word, then
look for a decimal integer; if there isn't one on the current line, it
will continue reading lines until it finds either a decimal integer or
something that definitely isn't one.

That might happen to work, but it's fragile. Also, it won't detect
an error such as:

joe 100
amy 80
may

42

fred 97

(I'm assuming you want each name and optional score to be on a single
line.)

A better solution is to read an entire line at a time (use fgets() if
you can assume a maximum line length) and then apply sscanf() to the
resulting string.

An advantage of sscanf() is that it doesn't consume its input; you can
pass the same string to it again with a different format. Another
advantage is that, if the string contains a single line of input, it
won't try to read additional lines; it treats the end of the string
like end-of-file.

--
Keith Thompson (The_Other_Keith) http://www.velocityreviews.com/forums/(E-Mail Removed) <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
no error by fscanf on reading from output file V.Subramanian, India C Programming 18 10-31-2011 08:46 PM
skip first N lines when reading file Jie Perl Misc 6 06-28-2007 09:07 AM
using fscanf to read data for a class member ... blacksoil@gmail.com C++ 7 09-05-2006 08:54 PM
fscanf reading lines bhanuprakash@gmail.com C Programming 7 03-08-2006 03:29 PM
Problems when reading from a file with fscanf Benedicte C Programming 3 02-04-2004 02:57 PM



Advertisments