ошибка компиляции: ifstream::open принимает только строковые значения в кавычках, а не строковые переменные

Есть ли у функции open какое-то ограничение на то, какое строковое значение передается?

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

Я пытался передать строковое значение с помощью строковой переменной, но когда он пытается скомпилироваться, результат...

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

С другой стороны, когда я просто передаю строковое значение в кавычках, например "filename.txt", оно компилируется и работает нормально.

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

Почему это так?

Есть ли способ решить эту проблему?


person Jason Kim    schedule 18.12.2011    source источник
comment
вы пытались передать указатель на массив символов?   -  person neeKo    schedule 18.12.2011
comment


Ответы (3)


К сожалению, именно так стандарт определяет конструктор и open из std::(i|o)fstream. Используйте file.open(filename.c_str()).

Некоторые стандартные библиотеки предоставляют расширение, которое позволяет использовать std::string в качестве параметра, например. Визуальная студия.

person Xeo    schedule 18.12.2011
comment
Спасибо Ксео. С помощью file.open(filename.c_str()) получилось. - person Jason Kim; 18.12.2011
comment
Это уже не расширение, а соответствие стандарту C++11. - person Bo Persson; 18.12.2011
comment
@Bo: Подождите, у нас есть такие в C++11? Я, должно быть, пропустил это. просматривает стандарт - person Xeo; 18.12.2011
comment
Я предполагаю, что причина, по которой const char* была предпочтительнее std::string, заключается в том, что имена файлов по определению (POSIX) никогда не могут содержать встроенные нули. Высказывание file.open(fname.c_str()) делает это явным для программиста - person sehe; 18.12.2011

У меня проблема исчезла, включив fstream и передав filename.c_str() вместо filename.

Сообщение о неполном типе связано с тем, что у вас отсутствует заголовок (вероятно, все равно вы не показали полный пример).

И open принимает строку в стиле c, а не класс string.

person tpg2114    schedule 18.12.2011

Я думаю, что ваши сообщения об ошибках могут быть не связаны с рассматриваемым кодом, но open использует стиль C const char*, а не C++ string. Вам нужно будет использовать filename.c_str() в вызове, чтобы он работал правильно.

person Mark B    schedule 18.12.2011
comment
Спасибо, Марк Б, за предложение. - person Jason Kim; 18.12.2011