Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2010, 00:37   #1
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию string vs. char

Вот отрывок из кода, где происходит открытие файла:
Код:
std::string filename(path_to_file); 
std::ifstream ifs(filename.c_str());
if(!ifs)
{  
   // код
}
// ИНАЧЕ, КОД...
где path_to_file - это char path_to_file[256]; // содержит путь "C:\\file.txt"

Почему если указывать константу, например
Код:
std:string filename = "C:\\file.txt"; 
std::ifstream ifs(filename.c_str());
if(!ifs)
{  
   // код
}
// ИНАЧЕ, КОД...
то файл будет находится нормально, а если делать, как в первом случае, всегда будет идти переход на цикл if (т.е. файл не найден), хотя при трассировке первого случая, в строковой переменной filename храниться будет правильный путь "C:\\file.txt"

подскажите, пожалуйста, решение данной проблемы...

Последний раз редактировалось tools; 22.12.2010 в 00:42.
tools вне форума Ответить с цитированием
Старый 22.12.2010, 00:39   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
string filename("C:\\file.txt"); 
std::ifstream ifs(filename.c_str());
if(!ifs)
{  
   // код
}
а если так?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.12.2010, 00:49   #3
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию

Пепел Феникса, таким образом тоже работает, но меня интересует первый случай, то есть когда у меня путь хранится в переменной типа char , а мне его нужно в string переделать...
tools вне форума Ответить с цитированием
Старый 22.12.2010, 00:51   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
char* path_to_file="C:\\file.txt";
std::string filename(path_to_file); 
std::ifstream ifs(filename.c_str());
if(!ifs)
{  
   // код
}
должно работать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.12.2010, 01:02   #5
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию

а без указателей нельзя преобразовать переменную типа char в string ??
Т.к. я описал ее как char path_to_file[256]; и используется она не единожды и не хотелось бы менять объявление.
tools вне форума Ответить с цитированием
Старый 22.12.2010, 01:08   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у вас та переменная константная или заполняется пользователем?
может просто терминальный ноль теряется иль еще чтото?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.12.2010, 01:12   #7
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию

заполняется пользователем, ноль не теряется, я его доставляю дополнительно в конец строки
Если быть точнее, то я пробую работать с сокетами (по протоколу UDP) и у меня этот путь к файлу передается с помощью recvfrom как строка типа char от клиента серверу.

Последний раз редактировалось tools; 22.12.2010 в 01:20.
tools вне форума Ответить с цитированием
Старый 22.12.2010, 01:39   #8
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию

Вот скрин с трассировки, после выполения оператора
std::string filename(path_to_file);

Затем идет строка
std::ifstream ifs(filename.c_str());
Вот после нее идет перход на if, чего быть по идеи не должно...
В чем может здесь быть загвоздка?
Изображения
Тип файла: jpg after_first.jpg (36.7 Кб, 135 просмотров)
tools вне форума Ответить с цитированием
Старый 22.12.2010, 01:42   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

посмотрите внимательно на то что у вас в массив еще попадает символ 10.(перед 0)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.12.2010, 01:49   #10
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию

точно, верно подметили. Я использовал в клиенте для чтение строки fgets, наверное надо поменять на gets его, чтобы не читал символ '\n'.
и если я буду использовать gets, то уже не надо будет '\0' в конец доставлять, я правильно понимаю?
Нет, для функции gets тоже пришлось добавлять '\0' в конец массива символов и проблема решилась. Спасибо Вам, Пепел Феникса, за вашу внимательность!

В итоге получаем строку std::ifstream ifs(path_to_file); без всяких преобразований.

Последний раз редактировалось tools; 22.12.2010 в 02:16.
tools вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
String To Char RIO Общие вопросы C/C++ 2 22.06.2010 00:30
char to string!!! marselik Общие вопросы C/C++ 3 01.06.2010 13:01
String и char Julinja Паскаль, Turbo Pascal, PascalABC.NET 9 03.01.2009 12:10
из string в char ShenDy Общие вопросы C/C++ 1 14.04.2008 11:01
char->string eds Общие вопросы .NET 1 28.11.2007 17:22