Newbie
Newbie

Reputation: 361

Pass a reference to std::ifstream as parameter

I'm trying to write a function with an ifstream& argument.

void word_transform(ifstream & infile)
{
    infile("content.txt");
    //etc
}

which gave me an error:

Type 'ifstream' (aka 'basic_ifstream ') does not provide a call operator.

Can you please me what's wrong?

Upvotes: 6

Views: 55990

Answers (5)

jpo38
jpo38

Reputation: 21584

call operator is a function like operator()( params ) allowing to use the syntax myObject( params ).

So, when you write infile(...), you are trying to us a call operator.

What you are trying to do is to open a file, use the open method:

void word_transform(ifstream & infile)
{
    infile.open("content.txt",std::ios_base::in);
    if ( infile.is_open() )
        infile << "hello";
    infile.close();
}

But, as commented, it does not really make sense to pass infile reference to such a function. You may consider:

void word_transform(istream& infile)
{
    infile << "hello";
}

int main()
{
    ifstream infile;
    infile.open("content.txt",std::ios_base::in);
    if ( infile.is_open() )
        word_transform( infile );
    infile.close();
    return 0;
}

Or:

void word_transform()
{
    ifstream infile;
    infile.open("content.txt",std::ios_base::in);
    if ( infile.is_open() )
        infile << "hello";
    infile.close();
}

int main()
{
    word_transform();
    return 0;
}

Upvotes: 8

Walter
Walter

Reputation: 45484

Typically, (references to) streams are passed to functions for I/O. This means the function should take std::istream or std::ostream argument, but not std::ifstream or std::ofstream. This way your function can be used with any stream object derived from std::istream, including std::cin, std::istrstream, and std::ifstream.

As nvoigt said, passing an std::ifstream to a function for opening makes little sense. It is definitely not clear to the caller that its stream may be closed and opened to another file.

Upvotes: 0

ravi
ravi

Reputation: 10733

infile("content.txt");

Note that this would try to call operator() on already created object of type infile. As no such operator exists from ifstream , you got an error.

Rather you should do:-

infile.open("content.txt");

Upvotes: 1

Codor
Codor

Reputation: 17605

To my understanding, the call operator is operator(), which apparently is not defined for ifstream. You have to do something different with the argument of word_transform.

Upvotes: 0

nvoigt
nvoigt

Reputation: 77364

You attempt to call operator() on your parameter. That will not work. Are you trying to open a file? If you get an ifstream as parameter, it should be open from the start because you opened it outside your function. Passing a stream and then opening it inside your function does not make sense.

void word_transform(std::ifstream& infile)
{
    // read something from infile
}

int main()
{
   std::ifstream file("content.txt");

   // error checks

   word_transform(file);

   return 0;
}

Upvotes: 3

Related Questions