Jason Kim
Jason Kim

Reputation: 19041

compile error: ifstream::open only accepts string values in quotes "" and not string variables

Does open function have some sort of restriction as to what kind of string value is passed in?

ifstream file;
string filename = "output.txt";
file.open(filename);

I tried to pass a string value with a string variable, but when it tries to compile, the result is...

agent.cpp:2:20: error: ofstream: No such file or directory
agent.cpp: In function ‘std::string readingline(std::string)’:
agent.cpp:11: error: aggregate ‘std::ifstream file’ has incomplete type and cannot be     defined
agent.cpp: In function ‘int main()’:
agent.cpp:44: error: aggregate ‘std::ofstream writefile’ has incomplete type and cannot be defined

On the other hand, when I just pass a string value in quotes like "filename.txt" , it compile fine and runs fine.

ifstream file;
file.open("output.txt");

Why is this the case?

Is there a way to solve this problem?

Upvotes: 5

Views: 5095

Answers (3)

Mark B
Mark B

Reputation: 96261

I think your error messages may be unrelated to the code in question, but open takes a C-style const char* and not a C++ string. You'll need to use filename.c_str() in the call to make it work correctly.

Upvotes: 1

Xeo
Xeo

Reputation: 131799

Sadly, this is how the constructor and open of std::(i|o)fstream are defined by the standard. Use file.open(filename.c_str()).

Some standard libraries provide an extension that allows std::string as a parameter, e.g. Visual Studio.

Upvotes: 5

tpg2114
tpg2114

Reputation: 15100

I got the problem to go away by including fstream and passing filename.c_str() instead of just filename.

The message about an incomplete type is because you are missing a header (probably anyway, you didn't show a full example).

And open takes a c-style string, not the string class.

Upvotes: 1

Related Questions