PDA

Показать полную графическую версию : [решено] Работа с строками


crashtuak
24-03-2009, 11:18
Такая вот проблема: Надо работать с строками, например получить переменную INI = GetCurrentDir()+"\ini\options.ini"- так я делал в Visual Basic ("GetCurrentDir()" - получаем путь к ехе нашей программы, "\ini\options.ini" - кусок недостающего пути к ini файлу, тоесть наш ini файл лежал в папке ini, которая в свою очередь лежала возле нашей программы, а в переменной INI мы получали полный путь "C:\myprog\ini\options.ini"). Но в с++ так делать нельзя. Подскажите, пожалуйста, как решить мой вопрос.

Busla
24-03-2009, 12:10
crashtuak, почему нельзя? В c++ ровно так же работает конкатенация строк через плюс. Или не найти аналога GetCurrentDir()?

EvgeniyQQQ
24-03-2009, 14:38
crashtuak, а по точней. Какими библиотеками пользуетесь? Пишите под WinApi, MFC, Qt, .Net ?.....

crashtuak
24-03-2009, 18:03
Сорь "+" работает и в С++, просто надо было соединить строки, одной с которых был символ "\", и вариант INI = GetCurrentDir()+"\" не работал, зато вот так INI = GetCurrentDir()+"""""\\""" все нормально сделалось :) :) :) . Может кто то знает, почему именно так, а не по другому?

Busla
24-03-2009, 18:29
crashtuak, потому что это специальный символ, используется для обозначения разных непечатных управляющих символов: табуляции \t, перевода строки \n и т.п. Ваши знания Visual Basic в C++ практически не пригодятся - лучше прочитайте какую-нибудь книжку, учебник по языку - это снимет множество вопросов.

crashtuak
24-03-2009, 19:09
crashtuak, потому что это специальный символ, используется для обозначения разных непечатных управляющих символов: табуляции \t, перевода строки \n и т.п. Ваши знания Visual Basic в C++ практически не пригодятся - лучше прочитайте какую-нибудь книжку, учебник по языку - это снимет множество вопросов. » Немного читал, но вопросов появилось ещё больше))) Вот для примера:
void RunWait(char* RunCmdLine);
void RunWait(char* RunCmdLine)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
if(CreateProcess(NULL, RunCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
WaitForSingleObject(pi.hProcess, INFINITE);
}
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
RunWait("E:\\ShowCmdParam.exe /sdsfsf /awfasfase");
}
Я нигде не нашел, почему в RunWait("E:\\ShowCmdParam.exe /sdsfsf /awfasfase"); нада использовать "\\" в пути к файлу, вместо привычного "\", с которым файл никак не хочет открываться. Может есть решение данного вопроса инным путем, кроме как добавления "\"? (это нужно, потому что с GetCurrentDir()+"\ini\options.ехе" мы получим C:\myprog\ini\options.ехе, и таким образом прога не запустится, а как автоматом дописать "\" я незнаю)

Drongo
24-03-2009, 19:24
Я нигде не нашел, почему в RunWait("E:\\ShowCmdParam.exe /sdsfsf /awfasfase"); нада использовать "\\" в пути к файлу, вместо привычного "\", с которым файл никак не хочет открываться »
потому что это специальный символ, используется для обозначения разных непечатных управляющих символов: табуляции \t, перевода строки \n и т.п. »

crashtuak
24-03-2009, 21:05
Есле можно, приведите пожалуйста пример переделывания C:\myprog\ini\options.ехе вC:\\myprog\\ini\\options.ехе

crashtuak
24-03-2009, 21:46
Есле можно, приведите пожалуйста пример переделывания C:\myprog\ini\options.ехе вC:\\myprog\\ini\\options.ехе »
Есть пердложение: посимвольно перебирать строку, потом разделить строку на части, которые заканчиваются на "\" и потом те части объединить , добавляя между ними "\". Так как нам надо переделать только путь к ехе, то и перебирать строку будем только к .ехе( выделеный момент я не знаю как реализовать). Прошу высказать недостатки моего способа и предлагать свои (свои способы а не недостатки :) ).

Delirium
25-03-2009, 01:01
что то мудрите вы сильно...
что мешает написать string mystring = @"C:\temp"; знак @ показывает, что это символьная переменная и можно использовать одиночные слеши.
Также есть функция Replace.
string mystring = "C:\temp";
mystring.Replace("\\", "\\\\");
на выходе получим C:\\temp

crashtuak
25-03-2009, 08:25
Delirium, я же С++ учу два дня. Огромное спасибо, а то я бы долго свой способ реализовывал :)

crashtuak
25-03-2009, 09:28
что то мудрите вы сильно...
что мешает написать
Код:
string mystring = @"C:\temp";
знак @ показывает, что это символьная переменная и можно использовать одиночные слеши.
Также есть функция Replace.
Код:
string mystring = "C:\temp";
mystring.Replace("\\", "\\\\");
на выходе получим C:\\temp » Ех, можна вопросик? К в AnsiString С++ билдере Replace неработает. Как быть то?

crashtuak
25-03-2009, 10:24
Блин, вот код:
void RunWait(AnsiString EXEFILE);
void RunWait(AnsiString EXEFILE)
{
char* command = EXEFILE.c_str();
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
if(CreateProcess(NULL, command, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
WaitForSingleObject(pi.hProcess, INFINITE);
}
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString exec=GetCurrentDir()+"\ShowCmdParam.exe /param1 /param2";
exec=AnsiReplaceStr(exec, "\\", "\\\\");
Label1->Caption= exec;
RunWait("E:\\DPSelecter\\Debug\\ShowCmdParam.exe /sdasf /asfsdgfrdg");
}
ShowCmdParam с ключами /param1 /param2 не запускается, тоесть AnsiReplaceStr(exec, "\\", "\\\\") бестолку, и без AnsiReplaceStr(exec, "\\", "\\\\") не запускается ShowCmdParam с ключами /param1 /param2. ShowCmdParam с ключами /sdasf /asfsdgfrdg запускается нормально. Как же все таки запустить AnsiString, который включает в себя GetCurrentDir() и тому подобное (ну переменные с текстом и тд)? Помогите пожалуйста!!!!!!!!!!!!!!

Busla
25-03-2009, 10:42
что то мудрите вы сильно... »
а сам?! - Надо вникнуть в вопрос, а не давать рецепты не разобравшись.

crashtuak, не нужно вам ничего подменять - литералы со слэшем имеют особое значение только в коде программы - в памяти строки хранятся в обычном виде (без всяких удвоений \). Т.е. часть пути, которую указываете в коде явно "\ini\options.ini" надо набрать с двойным слэшем, а результаты работы функций никак преобразовывать не надо.

crashtuak
25-03-2009, 11:29
Busla, спасибо, наконец то нубу сказали что сделать! :) :) :) :) :) . А я то ломаю голову, уже запарился блин. Большое спасибо, все работает.

Цитата Delirium:
что то мудрите вы сильно... »
а сам?! - Надо вникнуть в вопрос, а не давать рецепты не разобравшись. »
Busla, в том что Delirium "намудрил", виноват я, потому что он не знал, что строки с слэшел нужны мне для CreateProcess, а есле бы он знал, то возможно посоветовал бы что то другое.

pva
25-03-2009, 19:02
что мешает написать

string mystring = @"C:\temp"; »

Это на каком языке и каким компилятором? я удивился записи, собрал билдером

#include <string>
using namespace std;

int main()
{
string s1 = @"c:\temp";

return s1.size();
}

тот утверждает что я ошибаюсь:

D:\temp\3>bcc32 1.cpp
Borland C++ 5.6 for Win32 Copyright (c) 1993, 2002 Borland
1.cpp:
Error E2206 1.cpp 6: Illegal character '@' (0x40) in function main()
*** 1 errors in Compile ***

Delirium
26-03-2009, 01:21
Это на каком языке и каким компилятором? я удивился записи, собрал билдером »
C#, .NET Framework. Пользуюсь этим постоянно.

Согласен, я предложил неверный для crashtuak вариант. Я подумал, что ему просто надо строку получить с 2-мя слешами, а не то, что он пытается запустить команду в преобразованной строке.




© OSzone.net 2001-2012