SudoSilman
SudoSilman

Reputation: 37

Why does my countlines function always return 0?

So I am making a program for a simple calendar app which reads in inputs from a file input.csv (its a text file with two columns which are seperated using commas and new lines for each command).

The first thing i want to do is count the number of lines from the input file, which is passed as the third argument in the command line, so I can make an array to hold each line separately but the function countLines always returns 0!

Project code:

#include<iostream>
#include<string>
#include<fstream>
using namespace std;


//Prototypes
int countLines (ifstream& countfiles);


int countLines(ifstream& countfile)
//counts number of lines in file passed to function
{
   string line;
   int numberOfLines;

   numberOfLines = 0;

   //reads through each line until end of file
   while(getline(countfile, line))
   {
       numberOfLines++;
   }

   return numberOfLines;
}


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

    if(argc != 3) cout << "Usage: calendar.out datafile inputfile";

    //Create input streams to both files
    ifstream apptsfp;
    ifstream inputfp;

    //Open streams to both files
    apptsfp.open(argv[2]);
    inputfp.open(argv[3]);

        int numberOfInputs=0;

    numberOfInputs = countLines(inputfp)-1;

        cout << "number of input commands: " << numberOfInputs << endl;

    return 0;
}

Upvotes: 0

Views: 219

Answers (4)

Waqar
Waqar

Reputation: 9376

You are trying to access argv[3] which is null. Try this :-

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

    if(argc != 3)
        cout << "Usage: calendar.out datafile inputfile";

    //Create input streams to both files
    ifstream apptsfp;
    ifstream inputfp;

    //Open streams to both files
    apptsfp.open(argv[1]);
    inputfp.open(argv[2]);

    int numberOfInputs=0;

    numberOfInputs = countLines(inputfp)-1;

    cout << "number of input commands: " << numberOfInputs << endl;

    return 0;
}

Upvotes: 0

WhozCraig
WhozCraig

Reputation: 66254

Your access to argv[3] is incorrect. The second file name (third arg, including the program name in arg[0]) is in slot 2 (the array is zero-based).

Try:

apptsfp.open(argv[1]);
inputfp.open(argv[2])

Upvotes: 2

Some programmer dude
Some programmer dude

Reputation: 409442

It seems you only want two arguments, not three as you say in the question (the "first" argument is the program name). This means that the input file is in argc[2] instead, and argv[3] is a NULL pointer.

This means that your open call will fail, but you do not check for that.

Upvotes: 2

john
john

Reputation: 88017

Almost certainly because you are failing to open your input file.

inputfp.open(argv[3]);
if (!inputfp.is_open())
{
    cerr << "failed to open input file " << argv[3] << '\n';
    return 1;
}

Files can fail to open for all sorts of reasons, you should always check for this.

BTW don't use an array to hold the input lines, use std::vector<std::string>. Then you can use push_back to add the lines to the vector. This will be easier and more efficient because you won't have to read the file twice. What more could you ask for!

std::vector<std::string> lines;
std::string line;
while (getline(inputfp, line))
    lines.push_back(line);

Upvotes: 7

Related Questions