G
Generic Usenet Account
I have been to recreate a problem that I am having with strings with
the trivial code snippet given below. In the trivial code example, I
am reading five lines from a data file, each line having only one word.
I try to concatenate each word read into a string variable, separated
by a delimiter character. Even though I am able to read the words from
the file correctly, I am not able to correctly concatenate the string.
I was expecting the output to be a concatenated string containing all
the words, separated by the delimiter character, but that is not what
is happening.
I know that I am doing something silly. Any help will be appreciated.
Song
Code snipped follows
////////////////////////////////////////////////////
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
#define WORD_SEPARATOR ":"
#define DATAFILE "./data.dat"
//////////////////////////////////////////////////////////////
//
//
//////////////////////////////////////////////////////////////
bool
readRandomLine(const string fileName, string& line)
{
bool ret = false;
ifstream ifs(fileName.c_str());
if(!ifs)
{
cerr << "Cannot open file " << fileName << " ....ignoring" << endl;
return ret;
}
string token;
unsigned long nlCount = 0;
while(getline(ifs, token))
nlCount++;
if(nlCount)
{
ifs.clear();
ifs.seekg(0);
int randLineNum = rand()%nlCount + 1;
for(unsigned long i = 1; (i <= randLineNum) && getline(ifs, token);
i++);
if(ifs)
{
line = token;
ret = true;
}
}
ifs.close();
return ret;
}
//////////////////////////////////////////////////////////////
//
//
//////////////////////////////////////////////////////////////
bool
getWord(string& word, string fileName)
{
bool status = true;
status = readRandomLine(fileName, word);
return status;
}
//////////////////////////////////////////////////////////////
//
//
//////////////////////////////////////////////////////////////
void
fillString(string& val)
{
for(int i = 0; i < 5; i++)
{
string nextWord;
if(!getWord(nextWord, DATAFILE))
break;
else
{
cout << "Fetched word " << nextWord << endl;
val += nextWord;
val += WORD_SEPARATOR;
}
}
cout << endl;
}
//////////////////////////////////////////////////////////////
//
//
//////////////////////////////////////////////////////////////
main()
{
srand(time(NULL));
rand();
string valStr;
fillString(valStr);
cout << "The value string is: " << endl
<< valStr << endl;
return 0;
}
/////////////////////// Data File "./data.dat" ///////////////////
oak
object
objection
objective
obligation
observation
observer
obstacle
occasion
occupation
occurrence
ocean
Octavia
Octavio
odds
of
the trivial code snippet given below. In the trivial code example, I
am reading five lines from a data file, each line having only one word.
I try to concatenate each word read into a string variable, separated
by a delimiter character. Even though I am able to read the words from
the file correctly, I am not able to correctly concatenate the string.
I was expecting the output to be a concatenated string containing all
the words, separated by the delimiter character, but that is not what
is happening.
I know that I am doing something silly. Any help will be appreciated.
Song
Code snipped follows
////////////////////////////////////////////////////
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
#define WORD_SEPARATOR ":"
#define DATAFILE "./data.dat"
//////////////////////////////////////////////////////////////
//
//
//////////////////////////////////////////////////////////////
bool
readRandomLine(const string fileName, string& line)
{
bool ret = false;
ifstream ifs(fileName.c_str());
if(!ifs)
{
cerr << "Cannot open file " << fileName << " ....ignoring" << endl;
return ret;
}
string token;
unsigned long nlCount = 0;
while(getline(ifs, token))
nlCount++;
if(nlCount)
{
ifs.clear();
ifs.seekg(0);
int randLineNum = rand()%nlCount + 1;
for(unsigned long i = 1; (i <= randLineNum) && getline(ifs, token);
i++);
if(ifs)
{
line = token;
ret = true;
}
}
ifs.close();
return ret;
}
//////////////////////////////////////////////////////////////
//
//
//////////////////////////////////////////////////////////////
bool
getWord(string& word, string fileName)
{
bool status = true;
status = readRandomLine(fileName, word);
return status;
}
//////////////////////////////////////////////////////////////
//
//
//////////////////////////////////////////////////////////////
void
fillString(string& val)
{
for(int i = 0; i < 5; i++)
{
string nextWord;
if(!getWord(nextWord, DATAFILE))
break;
else
{
cout << "Fetched word " << nextWord << endl;
val += nextWord;
val += WORD_SEPARATOR;
}
}
cout << endl;
}
//////////////////////////////////////////////////////////////
//
//
//////////////////////////////////////////////////////////////
main()
{
srand(time(NULL));
rand();
string valStr;
fillString(valStr);
cout << "The value string is: " << endl
<< valStr << endl;
return 0;
}
/////////////////////// Data File "./data.dat" ///////////////////
oak
object
objection
objective
obligation
observation
observer
obstacle
occasion
occupation
occurrence
ocean
Octavia
Octavio
odds
of