BMG
BMG

Reputation: 87

Counting lines from a file input?

The following code is supposed to count: the lines, the characters and the words read from a text file.

Input text file:

This is a line.

This is another one.

The desired output is:

Words: 8

Chars: 36

Lines: 2

However, the word count comes out to 0 and if I change it then lines and characters come out to 0 and the word count is correct. I am getting this:

Words: 0

Chars: 36

Lines: 2

This is my code:

#include<iostream>
#include<fstream>
#include<string>

using namespace std;


int main()
{
    ifstream inFile;
    string fileName;


    cout << "Please enter the file name " << endl;
    getline(cin,fileName);
    inFile.open(fileName.c_str());

    string line;
    string chars;
    int number_of_lines = 0;
    int number_of_chars = 0;

while( getline(inFile, line) )
    {
        number_of_lines++;
        number_of_chars += line.length();
    }

    string words;
    int number_of_words = 0;

while (inFile >> words)
    {
        number_of_words++;
    }

    cout << "Words: " << number_of_words <<"" << endl;
    cout << "Chars: " << number_of_chars <<"" << endl;
    cout << "Lines: " << number_of_lines <<"" << endl;

    return 0;
}

Any guidance would be greatly appreciated.

Upvotes: 2

Views: 2740

Answers (2)

Ziezi
Ziezi

Reputation: 6457

Here is one possible implementation (not tested) to use as a benchmark:

int main(){

// print prompt message and read input
cout << "Please enter the file name " << endl;
string fileName;
getline(cin,fileName);

// create an input stream and attach it to the file to read
ifstream inFile;
inFile.open(fileName.c_str());

// define counters
string line;
string chars;
int number_of_lines = 0;
int number_of_chars = 0;
vector<string> all_words;

do{
    getline(inFile, line);
    // count lines
    number_of_lines++;
    // count words
    // separates the line into individual words, uses white space as separator
    stringstream ss(line);
    string word;
    while(ss >> word){
        all_words.push_back(word);
    }
}while(!inFile.eof())
// count chars
// length of each word
for (int i = 0; i < all_words.size(); ++i){
    number_of_chars += all_words[i].length(); 
}

// print result
cout << "Words: " << all_words.size() <<"" << endl;
cout << "Chars: " << number_of_chars <<"" << endl;
cout << "Lines: " << number_of_lines <<"" << endl;

return 0;
}

Upvotes: 1

user4581301
user4581301

Reputation: 33932

And because Comments are often unread by answer seekers...

while( getline(inFile, line) ) 

Reads through the entire file. When it's done inFile's read location is set to the end of the file so the word counting loop

while (inFile >> words)

starts reading at the end of the file and finds nothing. The smallest change to the code to make it perform correctly is to use seekg rewind the file before counting the words.

inFile.seekg (0, inFile.beg);
while (inFile >> words)

Positions the reading location to file offset 0 relative to the beginning of the file (specified by inFile.beg) and then reads through the file to count the words.

While this works, it requires two complete reads through the file, which can be quite slow. A better option suggested by crashmstr in the comments and implemented by simplicis veritatis as another answer requires one read of the file to get and count lines, and then an iteration through each line in RAM to count the number of words.

This has the same number of total iterations, everything must be counted one by one, but reading from a buffer in memory is preferable to reading from disk due to significantly faster, orders of magnitude, access and response times.

Upvotes: 2

Related Questions