Передача строкового аргумента в ifstream

Я пытаюсь передать строковый аргумент функции из основной функции, а затем передать полученный строковый аргумент конструктору ifstream. Я могу получить эту строку в функции, но когда я передаю этот аргумент ifstream, я получаю сообщение об ошибке:

нет соответствующей функции для вызова ‘std :: basic_ifstream :: basic_ifstream (const string &)’ std :: ifstream file (имя_файла);

Вот мой код:

int** read_CSV(std::string const& fileName)
{

 //cout<<fileName<<"\n";//this works

 std::ifstream file(fileName);//problem

 //Rest of logic
}

Основная функция:

int main()
{

 int** inputMatrix1 = read_CSV("inputData4_80-20_100x32.csv");

 return 0;
}

Переменная fileName создает проблему. Если я передам его как есть, он выдаст ошибку. Но вместо этого, если я явно укажу имя файла, используя строку, а не переменную, код будет работать нормально. Может кто-нибудь объяснить, в чем именно проблема и как я могу ее решить?

Какую версию GCC вы используете? В версиях до 5 (которые к настоящему времени довольно старые) вам необходимо явно включить режим C++ 11.

Some programmer dude 18.06.2018 14:06

Обратитесь к std::basic_ifstream::basic_ifstream: конкретный конструктор, который вам нужен, был добавлен в C++ 11, поэтому вам нужен компилятор, совместимый с C++ 11 (и запускайте его в режиме C++ 11)

Sander De Dycker 18.06.2018 14:11

@Someprogrammerdude Сейчас я использую GCC версии 5.4.0

archity 18.06.2018 14:28

До C++ 11 было необходимо выполнить std::ifstream file(fileName.c_str()), поскольку у std::ifstream не было конструктора, который принимал std::string в качестве аргумента. Начиная с C++ 11, std::ifstream имеет конструктор, который принимает std::string в качестве первого аргумента, поэтому ваш код будет работать.

Peter 18.06.2018 14:29

Тогда ваш код должен работать, поскольку в серии 5 GCC по умолчанию включен C++ 11. Пожалуйста, попробуйте создать Минимальный, полный и проверяемый пример, чтобы показать нам. И скопируйте и вставьте выходные данные ошибок полный и полный этого MCVE.

Some programmer dude 18.06.2018 14:30

@Someprogrammerdude Вы уверены, что gcc 5.x по умолчанию включает C++ 11? Я думаю, что это началось с gcc 6. Это не компилируется в godbolt (godbolt.org/g/W1bXTA) с gcc 5.4 без -std=c++11.

Holt 18.06.2018 14:35

@Peter, использующий c_str, решил проблему.

archity 18.06.2018 14:38

@archity Вам, вероятно, потребуется скомпилировать с -std=c++11, чтобы включить поддержку C++ 11 (который включает перегруженный конструктор для std::ifstream).

Holt 18.06.2018 14:39

@Holt Да, мне придется явно использовать слоган C++ 11, чтобы использовать его с g ++.

archity 18.06.2018 14:40

@Holt Ладно, это было недоразумение с моей стороны. Серия 5 по умолчанию не использует C++ 11, но по-прежнему старый -std=gnu++98. Таким образом, правильным решением для OP было бы не использование c_str(), а добавление флага -std=c++11 (или, возможно, -std=gnu++11, если требуются расширения GCC).

Some programmer dude 18.06.2018 14:40

@Peter Вы можете указать c_str как ответ на вопрос, объясняя также компиляцию C++ 11.

archity 18.06.2018 14:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
11
236
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, проблема заключалась в том, что я пытался скомпилировать без стандарта C++ 11, используя только g ++ "NameOfFile.cpp". В разделе комментариев есть два возможных решения проблемы:

  1. Использование -std = C++ 11 при подаче команды на компиляцию. Результирующая команда компиляции будет выглядеть следующим образом: g++ -std=c++11 "NameOfFile.cpp"
  2. Другое решение, как указано @Peter, заключается в использовании c_str() в конце строкового объекта, поскольку ifstream не принимает строки в качестве аргумента до C++ 11, поэтому c_str() используется для явного преобразования в совместимый формат. .

Вот измененная строка кода для второго решения: std::ifstream file(fileName.c_str());

Спасибо @Peter и @Holt за их вклад.

Другие вопросы по теме