Thursday 18 January 2018

c++ - Why using while(!input.eof()) loop twice not working?





On the following lines of code is intended to put every words in the
input text file(words are separated by new lines) to a vector of strings, then to turn
each word inside out, and to see if this turned word is contained in the list of words
in the input file.



I believe my binary search
function and wordTurn function works fine.
I did several simple tests on my
code, and I found out using while(!myFile.eof()) loop twice might be the cause for my
code not working. By not working I mean I get the output file("pairs.txt") as an empty
document(it is supposed to be a list of pairs of
words).



That is, when I put some simple print
code in the second while(!myFile.eof()) loop body, it did not get printed out, from
which I concluded this loop is not reached. This is more likely, since it printed when I
commented out the first while(!myFile.eof()) loop. I originally placed the first while
loop at the else body, but this made no
difference.



What do you think is the
problem?
I tried combining those two loop body into the second loop, and it
produces something in the output file, but this was not what this code was supposed to
do, and this was logically not
correct.




Any words of advice would be
greatly appreciated.



int main(int
argc, char* argv[]) {

vector words;

ifstream myFile(argv[1]);
ofstream outputFile("pairs.txt");
string
vocab;
string s;

int count;


while(!myFile.eof()) { //first while(!myFile.eof()) loop
getline(myFile,
s);
words.push_back(s);
}

if(argc != 2)
{
cout << "Usage: provide the name of one input file after the
dictlookupHN executable file." << endl;
return
(1);

}
else {
if(!myFile.is_open())
{
cerr << "Error: unable to open file " << argv[1] <<
endl;
return (1);
}
else {

while(!myFile.eof()) { //second while(!myFile.eof()) loop
getline(myFile,
vocab);
string turnedWord = wordTurn(vocab);


if(binsearch(words, turnedWord) != "") {
outputFile << vocab <<
":" << turnedWord << endl;
count++;
}

}
}

}
myFile.close();

outputFile.close();


return
0;
}

class="post-text" itemprop="text">
class="normal">Answer



The
ifstream class maintains an internal offset into the stream data, keeping track where it
has to read from, for the next operation.



When
this offset reaches the end, it stops the first loop, (eof()
returns false). You need to reset this internal position back to the beginning of the
file, before reading again.



You do that by
saying:




myFile.clear();
// clear stream flags and error state
myFile.seekg(0, ios::beg); // reset read
position


before the
second loop.



Edit: Added call to
clear().


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...