delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2001/06/11/22:30:21

From: "Dr Joolz" <julius_mong AT hotmail DOT com>
Newsgroups: comp.os.msdos.djgpp,gnu.g++.help
Subject: How to clear char array buffer[]?
Lines: 106
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 5.50.4522.1200
X-Mimeole: Produced By Microsoft MimeOLE V5.50.4522.1200
Message-ID: <hReV6.15706$6d5.2182887@news2-win.server.ntlworld.com>
Date: Tue, 12 Jun 2001 03:09:29 +0100
NNTP-Posting-Host: 213.105.24.25
X-Complaints-To: abuse AT ntlworld DOT com
X-Trace: news2-win.server.ntlworld.com 992311757 213.105.24.25 (Tue, 12 Jun 2001 03:09:17 BST)
NNTP-Posting-Date: Tue, 12 Jun 2001 03:09:17 BST
Organization: ntlworld News Service
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

Dear all, I have some code like this:

while (!fin.eof()) {
  fin.getline(buffer, MAX);
  token = strtok( buffer, seps );
  while ( token != NULL ) {
   dict.insertN(token, i);
   cout << i << token << endl;
   cout << dict;
   token = strtok( NULL, seps );
   i++;
   }
}

and it is causing problems with what's read in buffer every time getline is
executed, if I used a different char buffer in getline in each while exec
problem gone. So I know it is buffer that's not being reset to empty at the
end of each while loop, how do I do that? I tried buffer = ""; or NULL or
assigning buffer[i] = '\0' etc won't work...

The code in main() is:

 ifstream fin("test.txt");
 int i=1;
 char* token;

 while ( fin.getline(buffer,MAX).good() ) {
  token = strtok( buffer, seps );
  while ( token != NULL ) {
   dict.insertN(token, i);
   cout << i << token << endl;
   cout << dict;
   token = strtok( NULL, seps );
   i++;
   }
 }

...where test.txt contains:

Hello World
this is fun

...and will produce the following output:

1Hello
 [Hello] -> oo
2World
 [Hello] ->  [World] -> oo
3this
 [this] ->  [s fun] ->  [this] -> oo
4is
 [this] ->  [s] ->  [this] ->  [is] -> oo
5fun
 [this] ->  [s] ->  [this] ->  [is] ->  [fun] -> oo
 [] ->  [s] ->  [] ->  [is] ->  [fun] -> oo

...dict is a linked list and i've overloaded << to print the list items like
above. what i'm trying to do is read a line then tokenise each line with
separators like spaces, \n\t,. etc and store those words in the linked list.
(spell checker exercise) but i've tried a few different ways to define the
while condition but still does the same thing... any ideas?

But if I did this:

 // while ( fin.getline(buffer,MAX).good() ) {

  fin.getline(buffer, MAX);
  token = strtok( buffer, seps );
  while ( token != NULL ) {
   dict.insertN(token, i);
   cout << i << token << endl;
   cout << dict;
   token = strtok( NULL, seps );
   i++;
   }

  fin.getline(buffer2, MAX);
  token = strtok( buffer2, seps );
  while ( token != NULL ) {
   dict.insertN(token, i);
   cout << i << token << endl;
   cout << dict;
   token = strtok( NULL, seps );
   i++;
   }

 //}

without while loop but define 2 separate buffers it works and gives me this:

1Hello
 [Hello] -> oo
2World
 [Hello] ->  [World] -> oo
3this
 [Hello] ->  [World] ->  [this] -> oo
4is
 [Hello] ->  [World] ->  [this] ->  [is] -> oo
5fun
 [Hello] ->  [World] ->  [this] ->  [is] ->  [fun] -> oo

Any help appreciated... please help...

Jules


- Raw text -


  webmaster     delorie software   privacy  
  Copyright 2019   by DJ Delorie     Updated Jul 2019