X-Authentication-Warning: delorie.com: mailnull set sender to djgpp-bounces using -f From: "Goh, Yong Kwang" Newsgroups: comp.os.msdos.djgpp Subject: detecting EOF when using fscanf() Date: Thu, 25 Apr 2002 12:38:50 +0800 Organization: Singapore Telecommunications Ltd Lines: 99 Message-ID: NNTP-Posting-Host: tns03821.singnet.com.sg X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 5.50.4133.2400 X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com I'm currently using scanf in a while loop to read in a text data file which has a format slightly similar to a makefile, a text script-like file separated by \n and \t. Example: ---START--- Component cSearchBox "search.html"\n Component cNavBar "navbar.html"\n Component cPageCounter "counter.html"\n Template tMain "main.html"\n \t cSearchBox\n \t cNavBar\n \t cPageCounter\n Document dMain "doc1.html"\n \t tMain\n ---END--- The \n and \t are placeholder for illustration purpose only. Since each token is a string, so i always call fscanf(FH, "%s", &buffer); to read in each token one-by-one until there's no more left. The problem occurs after reading in the last token "tMain" as the following sample output indicates: ---START--- D:\TEMP>readfile Component cSearchBox "search.html" Component cNavBar "navbar.html" Component cPageCounter "counter.html" Template tMain "main.html" cSearchBox cNavBar cPageCounter Document dMain "doc1.html" tMain tMain D:\TEMP> ---END--- Notice the last token "tMain" got printed twice which infers that the loop was repeated another 1 last time after the last token. ---START--- #include main(){ char buffer[80]; FILE* CONFIG; CONFIG = fopen("config.txt", "rt"); if(CONFIG != NULL){ while(!feof(CONFIG)){ fscanf(CONFIG, "%s", &buffer); printf("%s\n", buffer); } fclose(CONFIG); } else{ perror("Cannot open file!\n"); } return 0; } ---END--- After reading in the last token, the loop doesn't terminate immediately, which I suspect is due to the \n character after the "tMain". Since the EOF character is not immediately present after "tMain", the loop goes through another time but this time it fails to find any more string token, encounters the EOF char and then terminates. I cannot check for such a condition by comparing if the newly-read token is the same token as the one read in previous loop, strcmp(old, new), since there may be a legitimate line with the same 2 tokens *actually* appearing in consecutive order e.g. Component Component. So is there any easy way to overcome this problem, or do I have to do the tokenizing and parsing character by character using fgetc instead for the program to work more reliably? -- Yong-Kwang Goh Singapore gohyongkwang AT hotmail DOT com --- Outgoing mail is certified Virus Free. Checked by AVG anti-virus system (http://www.grisoft.com). Version: 6.0.351 / Virus Database: 197 - Release Date: 4/19/02