Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Работа с строками (http://forum.oszone.net/showthread.php?t=135676)

crashtuak 24-03-2009 11:18 1073026

Работа с строками
 
Такая вот проблема: Надо работать с строками, например получить переменную 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 1073094

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

EvgeniyQQQ 24-03-2009 14:38 1073266

crashtuak, а по точней. Какими библиотеками пользуетесь? Пишите под WinApi, MFC, Qt, .Net ?.....

crashtuak 24-03-2009 18:03 1073458

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

Busla 24-03-2009 18:29 1073484

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

crashtuak 24-03-2009 19:09 1073528

Цитата:

Цитата Busla
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 1073546

Цитата:

Цитата crashtuak
Я нигде не нашел, почему в RunWait("E:\\ShowCmdParam.exe /sdsfsf /awfasfase"); нада использовать "\\" в пути к файлу, вместо привычного "\", с которым файл никак не хочет открываться »

Цитата:

Цитата Busla
потому что это специальный символ, используется для обозначения разных непечатных управляющих символов: табуляции \t, перевода строки \n и т.п. »


crashtuak 24-03-2009 21:05 1073669

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

crashtuak 24-03-2009 21:46 1073702

Цитата:

Цитата crashtuak
Есле можно, приведите пожалуйста пример переделывания C:\myprog\ini\options.ехе вC:\\myprog\\ini\\options.ехе »

Есть пердложение: посимвольно перебирать строку, потом разделить строку на части, которые заканчиваются на "\" и потом те части объединить , добавляя между ними "\". Так как нам надо переделать только путь к ехе, то и перебирать строку будем только к .ехе( выделеный момент я не знаю как реализовать). Прошу высказать недостатки моего способа и предлагать свои (свои способы а не недостатки :) ).

Delirium 25-03-2009 01:01 1073840

что то мудрите вы сильно...
что мешает написать
Код:

string mystring = @"C:\temp";
знак @ показывает, что это символьная переменная и можно использовать одиночные слеши.
Также есть функция Replace.
Код:

string mystring = "C:\temp";
mystring.Replace("\\", "\\\\");

на выходе получим C:\\temp

crashtuak 25-03-2009 08:25 1073977

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

crashtuak 25-03-2009 09:28 1074021

Цитата:

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

Ех, можна вопросик? К в AnsiString С++ билдере Replace неработает. Как быть то?

crashtuak 25-03-2009 10:24 1074067

Блин, вот код:
Код:

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 1074092

Цитата:

Цитата Delirium
что то мудрите вы сильно... »

а сам?! - Надо вникнуть в вопрос, а не давать рецепты не разобравшись.

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

crashtuak 25-03-2009 11:29 1074157

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

Цитата:

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

Busla, в том что Delirium "намудрил", виноват я, потому что он не знал, что строки с слэшел нужны мне для CreateProcess, а есле бы он знал, то возможно посоветовал бы что то другое.

pva 25-03-2009 19:02 1074629

Цитата:

Цитата Delirium
что мешает написать
Код:

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 1074920

Цитата:

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

C#, .NET Framework. Пользуюсь этим постоянно.

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


Время: 19:40.

Время: 19:40.
© OSzone.net 2001-