Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*'

Ответить
Настройки темы
C/C++ - [решено] cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*'

Аватара для Acuna

Новый участник


Сообщения: 17
Благодарности: 0

Профиль | Отправить PM | Цитировать


Всем привет!

Работаю с плюсами недавно, перехожу с PHP, и уже понял, что знакомство будет долгим :D

Возникла проблема с разными типами данных в разных функциях.

Вот у меня имеется простенькая функция:

Цитата:
string read_file (string file) {
return file;
}
Ее вывод такой:

Цитата:
cout << read_file ("C:/ru.ini");
То есть я засовываю в нее строку. Все работает отлично. Но если в ней попытаться запустить еще одну какую-либо функцию, например

Цитата:
string read_file (string file) {
FILE *fp = fopen (file, "rb");
return file;
}
возникает ошибка

Цитата:
cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*' for argument '1' to 'FILE* fopen(const char*, const char*)'
То есть как я понял, в fopen должно суваться char, а я пытаюсь сунуть строку, ибо у меня введена строка.

Что тут можно сделать? Затыкнулся в самом начале)

Заранее благодарен!

Отправлено: 01:51, 27-03-2014

 

Пользователь


Сообщения: 121
Благодарности: 35

Профиль | Отправить PM | Цитировать


Цитата Acuna:
То есть как я понял, в fopen должно суваться char, а я пытаюсь сунуть строку, ибо у меня введена строка. »
Не совсем. Нужно не char, а char*. Это наследие языка C, где не было типа данных "строка". Строки там представлялись как символьный массив завершаемый нулевым символом. Но типа данных "массив" в C тоже нет, так что используется их более низкоуровневое представление как указателя на первый элемент. Так что ничего удивительного, что функция, ожидающая получить указатель на символ, начинает ругаться получив объект класса string (обратите внимание, что string это именно класс).
Попробуйте воспользоваться методом c_str. Скорее всего поможет.
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:27, 27-03-2014 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата torauma:
Попробуйте воспользоваться методом c_str. Скорее всего поможет. »
Если редактор юникодный то иногда вместо c_str(), канает t_str()

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:04, 27-03-2014 | #3


Аватара для Acuna

Новый участник


Сообщения: 17
Благодарности: 0

Профиль | Отправить PM | Цитировать


torauma, Drongo, большое спасибо!

Честно сказать, ни в коем случае не хочу никого обидеть, но я разочарован. Я почти 7 лет пишу на PHP в крупном проекте. С плюсами пришлось иметь дело, ибо решил создать один проектик для души. В общем, много говорится о языках высокого уровня, как это круто и мощно, но как же так? Проблемы возникают на каждом символе! То нельзя, то недоработано, того нет. С массивами можно работать только благодаря огромной библиотеке map, нет даже банальной str_replace! Находил в инете много примеров ее, но большинство из них - классы на пол страницы. Понятно, что языки такого рода - это просто каркас, и на нем каждый пишет так, как считает нужным, но стоит ли тратить время на такую писанину, которую можно сократить в разы? Да и оптимально ли это, когда одни и те же функции пишут люди с разным уровнем знаний и умений? Начиная писать на сях, я думал, что меня будет удивлять каждый символ, я буду говорить "Вау!", "О даааа!", Он такой классный!", "Все-таки PHP - это #&%№". А что я получил в итоге? Еле рабочий и то с кучей костылей код, и то который неизвестно как будет вести себя на разных машинах... С PHP вообще проблем такого рода никогда не было. Жаль, конечно, что он только сетевой...

Розовые очки разбились, честно сказать(

Последний раз редактировалось Acuna, 29-03-2014 в 14:18.


Отправлено: 14:11, 29-03-2014 | #4


Новый участник


Сообщения: 1
Благодарности: 0

Профиль | Отправить PM | Цитировать


Acuna, вы слишком рано делаете выводы - вы ещё слишком мало познали С++
1) в своём коде вы перемешали С и С++.
std::string - это из С++
fopen - это из С

2) вот вам пример чтения из файла
Код: Выделить весь код
 
#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <sstream>


void main() {
	std::string file_name("test.txt");
	std::ifstream file(file_name);
	std::ostringstream result_sstr;

	std::copy(std::istreambuf_iterator<char>(file),
			std::istreambuf_iterator<char>(),
			std::ostreambuf_iterator<char>(result_sstr));

	std::cout << result_sstr.str() << std::endl;
}
Комментарии писать лень - надеюсь разберётесь

Отправлено: 19:33, 22-04-2014 | #5

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Acuna, любое познание нового начинается со слов: "забудьте всё, что знали до этого". C++ вырос на C, вобрал в себя огромный опыт разработчиков в т..ч. низкого уровня, достаточно изощрённых инженеров. PHP предназначен чтобы быстро слабать на коленке домашнюю страничку (без обид, метафора). Чтобы почувствовать красоту и мощь C++ требуется знать много мат.части, абстракций и приёмов программирования (на низком уровне). Оттуда и трудности у начинающих). Моя первая "hello c++", 15 лет назад, вообще не скомпилировалась.

Холивар по пунктам:
Цитата Acuna:
То нельзя, то недоработано »
Всё можно, и очень тонко проработано. Почитайте про контейнеры, итераторы, фасеты, буферизованные потоки. При этом оставлена куча дверей для наращивания функционала. Почитайте про библиотеки (например boost). Также C++ обеспечивает совместимость с C, поэтому если ваша любимая функция (например perl regex) в сишной библиотеке - велкам!

Цитата Acuna:
С массивами можно работать только благодаря огромной библиотеке map »
Категорически не согласен. Массив и map - это линейный набор однотипных экземпляров и сортированный словарь соответственно. С массивами работать через алгоритмы над итераторами. Map тут вообще не причём. И библиотека малюсенькая, пару классов содержит, Iostream куда больше будет.

Цитата Acuna:
нет даже банальной str_replace »
В STL отсутствует множество "нужных" функций. Как правило их можно получить простой комбинацией того, что есть. По этой причине они и выкинуты. С/С++ обычно применяется для задач, требующих высокую скорость и управляемый расход памяти. Str_replace можно сделать так:
1. использовать вашу любимую реализацию (из любой библиотеки)
2. заменить на месте (в строке) - for(p1=0; 1+(p1=str.find("what", p1)); str.replace(p1, 4, "to"), p1+=2) {}
3. заменить в другой буфер (если заранее выделить память - будет работать экстремально быстро) - for(p1=0; (out.append(str, p1, (p2=str.find("what", p1))-p1), p2+1); out.append("to"), p1=p2+4) {}
4. заменить с выводом в поток (позволяет офигительно экономить память в некоторых случаях) - for(p1=0; (out.write(&str[p1], (p2=str.find("what", p1))-p1), p2+1); out.write("to"), p1=p2+4) {}
и т.д.
3 реализации, менее, чем на пол-страницы

Цитата Acuna:
Понятно, что языки такого рода - это просто каркас »
Любой язык бесполезен без сказок/историй. Для программистов - это библиотеки функций. Используйте библиотеки и будет вам лаконичное счастье.

Acuna, если у вас задача сделать быстро и не париться, то С++ - не для вас. Он для сугубо дотошных людей, которым надо чтобы было идеально. Если цель узнать, что в нём другие нашли - добро пожаловать, спрашивайте - расскажем. Запаситесь терпением, там ооочень много всего.

Отправлено: 20:52, 22-04-2014 | #6


Аватара для Acuna

Новый участник


Сообщения: 17
Благодарности: 0

Профиль | Отправить PM | Цитировать


pva,

Цитата:
PHP предназначен чтобы быстро слабать на коленке домашнюю страничку
Да, я часто встречаю такое мнение. Но чаще всего оно мотивировано тем, что как правило люди даже не знают, насколько продвинулся в своем развитии PHP за эти годы. Действительно, возникнув изначально как набор инструментов для клепания одиночных страничек, со временем он перерос в очень мощный и серьезный инструмент разработки, на сегодняшний день полноценно (именно так) поддерживающий такие вещи как ООП (поддерживающего практически все существующие на сегодняшний день паттерны типа синглтонов, обозревателей, декораторов, фабрик, ну и прочих достаточно специфичных), переключатели, исключения (try, catch, finally, как полагается ), области видимости методов, и даже трейты :/ В общем, теперь он настолько не похож на свои первые версии, что даже потребовалось переименовать его аббревиатуру (да-да, мало кто знает, что теперь она расшифровывается как PHP: Hypertext Preprocessor вместо Personal Home Page Tools)! Ну и как я уже говорил, он помогает избежать излишней писанины, как например в случае со str_replace (). Кстати, она написана С. Вообще, в PHP много что написано на С, просто он позволяет не изобретать велосипед, ну и дает уверенность в том, что стандартная функция написана получше, чем моя, надерганая из инета, да еще и с кучей костылей... Мне не надо думать, как распределяется память переменных, не бывает конфликтов с типами данных (и правда, а зачем?). Разве что не получится сконкатенировать строку с массивом и тому подобное. Если уж очень хочется - можно принудительно определить переменную как (int) $var, например. Ну и так далее...

Ну и всем известно, что практически все известные крупные веб-ресурсы написаны на PHP: eBay, Amazon - это PHP и немного Java, Facebook и некая небезызвестная маргинальная социальная сеть - это чистый PHP, и т. д. А ведь это даже не сайты, они называются "продукты". О как!) Особенно когда сейчас все уходит в облака, это особенно актуально.
Так что возможно дело просто в понимании того или иного вопроса?

Цитата:
если у вас задача сделать быстро и не париться, то С++ - не для вас.
Да все дело в том, что изначально я выбрал плюсы, чтобы после окон можно было легче портировать ее для никсов. Ну уже все, начал, дак начал) Да и изучение чего-то нового очень даже не помешает) Хотя в PHP столько уже нового, что я уже давно считаю, что мое развитие остановилось очень давно

Цитата:
Если цель узнать, что в нём другие нашли - добро пожаловать, спрашивайте - расскажем.
О, это спасибо, это действительно очень приятно! Вообще, если бы такой же подход был у преподавателей в универах (ну вкупе с желанием самих студентов, конечно же), разработка в нашей стране была бы в разы лучше. А там того и гляди, ВВП бы пошел бы вверх... Не, ну а вдруг?)

Отправлено: 18:35, 24-04-2014 | #7


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата Acuna:
насколько продвинулся в своем развитии PHP за эти годы. »
Интерпретатор научился принимать код в UTF-8 с BOM?

Отправлено: 21:12, 24-04-2014 | #8

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата Acuna:
чтобы после окон можно было легче портировать ее для никсов »
Если цель - портировать, то погляди в сторону явы. Там офигительно много библиотек, нет возможности заморачиваться с памятью, при правильном писании работает на любой платформе без изменений. И полно инструментов для быстрой разработки.

Цитата Acuna:
не бывает конфликтов с типами данных (и правда, а зачем?) »
Типизацию данных придумали для того, чтобы проверять программу на корректность до запуска. Задавая тип данных, мы постулируем условия использования, принимаемые значения и т.д., ограничиваете возможные варианты, расставляете проверочные контрольные точки. Если возникает конфликт типов - это признак некорректности программы, указатель на логическую ошибку.
Также придерживаюсь мнения о нужности варнингов компилятора и отладчика, ассертов и юнит-тестов

Отправлено: 22:09, 24-04-2014 | #9


Аватара для Acuna

Новый участник


Сообщения: 17
Благодарности: 0

Профиль | Отправить PM | Цитировать


pva, хм, интересно... Я о Java не думал... И консольные приложения тоже можно на ней писать? У меня консольное.
Ну да ладно, не каждый день попробуешь С++ все-таки

Iska, что Вы имеете ввиду? Если поддержку utf-8 в проектах, то окончательно на нее перешли уже давно. Функции для работы с многобайтовыми кодировками (не обязательно utf-8) были введены несколько лет назад, и за эти годы уважающие себя проекты полностью перешли на нее. Хотя изначально это было сродни проблеме 2k. Ну ничего, все всё переписали. Теперь это уже считается просто стандартом де-факто.

Цитата:
Также придерживаюсь мнения о нужности варнингов компилятора и отладчика, ассертов и юнит-тестов
Вы имеете ввиду для С++?

Последний раз редактировалось Acuna, 26-04-2014 в 13:11.


Отправлено: 13:03, 26-04-2014 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*'

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Ошибка во время установки Windows 2012 Std на Hyper-V (Host Win2012 Std)) Farxat Windows Server 2012/2012 R2 1 18-03-2013 14:56
[решено] Exchange 2010 std + WS2012 std bee_loky Windows Server 2012/2012 R2 1 15-01-2013 22:13
C/C++ - std::string - переделать символы в 16-bit Unicode crashtuak Программирование и базы данных 1 21-08-2012 17:19
C/C++ - int в char, когда int > char crashtuak Программирование и базы данных 2 21-08-2012 17:13
DNS/DHCP - Сетевые параметры на серверах <Windows Server 2003 Std + ISA 2006> Yappi Сетевые технологии 5 14-10-2008 13:58




 
Переход