![]() |
can fscanf skip reading data conditionally?
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!! |
Re: can fscanf skip reading data conditionally?
"John" <javacc1@gmail.com> wrote in message news:1159372487.763569.18800@i3g2000cwc.googlegrou 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 |
Re: can fscanf skip reading data conditionally?
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 |
Re: can fscanf skip reading data conditionally?
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. |
Re: can fscanf skip reading data conditionally?
"Robert Gamble" <rgamble99@gmail.com> 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) kst-u@mib.org <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. |
| All times are GMT. The time now is 02:48 AM. |
Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.