Re: переносимое консольное приложение с текстовыми аргументами в
От: andrey.desman Россия  
Дата: 22.12.16 13:51
Оценка: +1
Здравствуйте, _hum_, Вы писали:

__>в командной строке конcольному приложению передается имя файла. его нужно открыть (и что-то там сделать).

__>как в такой постановке написать переносимый source-code (чтоб можно было скомпилировать и на gcc под Linux, и на msvs под windows)?

argv[1], fopen/fread, ifstream, ..., PROFIT
Re: переносимое консольное приложение с текстовыми аргументами в
От: TimurSPB Интернет  
Дата: 22.12.16 14:41
Оценка: +1
Здравствуйте, _hum_, Вы писали:

__>в командной строке конcольному приложению передается имя файла. его нужно открыть (и что-то там сделать).

__>как в такой постановке написать переносимый source-code (чтоб можно было скомпилировать и на gcc под Linux, и на msvs под windows)?

1. Берём cmake для сборки
2. Подключаем boost
3. С помощью boost::program парсерим параметры
4. С помощью boost::file_system открываем и читаем.
5. ?????
6. Profit!
Make flame.politics Great Again!
переносимое консольное приложение с текстовыми аргументами в
От: _hum_ Беларусь  
Дата: 22.12.16 13:47
Оценка:
в командной строке конcольному приложению передается имя файла. его нужно открыть (и что-то там сделать).
как в такой постановке написать переносимый source-code (чтоб можно было скомпилировать и на gcc под Linux, и на msvs под windows)?
Re[2]: переносимое консольное приложение с текстовыми аргументами в
От: _hum_ Беларусь  
Дата: 22.12.16 13:57
Оценка:
Здравствуйте, andrey.desman, Вы писали:

AD>Здравствуйте, _hum_, Вы писали:


__>>в командной строке конcольному приложению передается имя файла. его нужно открыть (и что-то там сделать).

__>>как в такой постановке написать переносимый source-code (чтоб можно было скомпилировать и на gcc под Linux, и на msvs под windows)?

AD>argv[1], fopen/fread, ifstream, ..., PROFIT


если б было все так легко...

int _tmain(int argc, _TCHAR* argv[])

компилятор под винду дает argv[1] типа wchar_t*, тогда как при компиляции под юникс будет char*
Re[3]: переносимое консольное приложение с текстовыми аргументами в
От: uzhas Ниоткуда  
Дата: 22.12.16 14:22
Оценка:
Здравствуйте, _hum_, Вы писали:

__>если б было все так легко...


__>
__>int _tmain(int argc, _TCHAR* argv[])
__>

вы называете это переносимым кодом?

__>компилятор под винду дает argv[1] типа wchar_t*, тогда как при компиляции под юникс будет char*

и под виндой и под линуксами доступны сигнатуры (точки входа)
int main(int, char*[])
int main(int, wchar_t*[])


если первую возьмете, то ifstream/fopen решит вашу задачу, но частично, ибо с символами не из текущей локали могут быть проблемы под виндой
если возьмете вторую (с wchar_t), то тут уже придется использовать бустовые обертки : http://www.boost.org/doc/libs/1_57_0/boost/filesystem/fstream.hpp
или сами пишите обертки отдельно для линукса, отдельно для винды
Re[4]: переносимое консольное приложение с текстовыми аргументами в
От: _hum_ Беларусь  
Дата: 22.12.16 14:40
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, _hum_, Вы писали:


__>>если б было все так легко...


__>>
__>>int _tmain(int argc, _TCHAR* argv[])
__>>

U>вы называете это переносимым кодом?

нет, я показываю, что в зависимости от настроект компилятора, могут быть разные типы у аргумента

__>>компилятор под винду дает argv[1] типа wchar_t*, тогда как при компиляции под юникс будет char*

U>и под виндой и под линуксами доступны сигнатуры (точки входа)
U>
U>int main(int, char*[])
U>int main(int, wchar_t*[])
U>


U>если первую возьмете, то ifstream/fopen решит вашу задачу, но частично, ибо с символами не из текущей локали могут быть проблемы под виндой

U>если возьмете вторую (с wchar_t), то тут уже придется использовать бустовые обертки : http://www.boost.org/doc/libs/1_57_0/boost/filesystem/fstream.hpp
U>или сами пишите обертки отдельно для линукса, отдельно для винды


ибо с символами не из текущей локали могут быть проблемы под виндой

а можно поподробнее? какие символы могут быть в командной строке, и при этом не быть в текущей локале (локаль я не меняю сам)?

и если есть другие строковые аргументы в командной строке, то правильно ли поступаю, собираясь принимать все как char*, а потом конвертить в wchar_t через mbstowcs (которая учитывает локаль, и значит, по идее, должна правильно преобразовывать)?


п.с. сторонние библиотеки мне использовать нельзя
Re[2]: переносимое консольное приложение с текстовыми аргументами в
От: _hum_ Беларусь  
Дата: 22.12.16 14:45
Оценка:
Здравствуйте, TimurSPB, Вы писали:

TSP>Здравствуйте, _hum_, Вы писали:


__>>в командной строке конcольному приложению передается имя файла. его нужно открыть (и что-то там сделать).

__>>как в такой постановке написать переносимый source-code (чтоб можно было скомпилировать и на gcc под Linux, и на msvs под windows)?

TSP>1. Берём cmake для сборки

TSP>2. Подключаем boost
TSP>3. С помощью boost::program парсерим параметры
TSP>4. С помощью boost::file_system открываем и читаем.
TSP>5. ?????
TSP>6. Profit!

без сторонних библиотек, минимумом усилий
Re[3]: переносимое консольное приложение с текстовыми аргументами в
От: uzhas Ниоткуда  
Дата: 22.12.16 14:59
Оценка:
Здравствуйте, _hum_, Вы писали:

__>без сторонних библиотек, минимумом усилий


минимум усилий — это работать с char* и ничего не конвертить
ну какие-то мохнатые кейсы не будут работать типа иероглифы в названиях файлов

иначе это сложно. надо искать по форуму, уже не раз обсуждали
Re[3]: переносимое консольное приложение с текстовыми аргументами в
От: TimurSPB Интернет  
Дата: 22.12.16 15:07
Оценка:
__>без сторонних библиотек, минимумом усилий
Тогда просто берем и пишем код который парсерит параметр, открывает файл и читает. По каждому пункту есть примеры на stackoverflow
Make flame.politics Great Again!
Re[4]: переносимое консольное приложение с текстовыми аргументами в
От: _hum_ Беларусь  
Дата: 22.12.16 15:08
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, _hum_, Вы писали:


__>>без сторонних библиотек, минимумом усилий


U>минимум усилий — это работать с char* и ничего не конвертить


тогда не получится посимвольный анализ строк делать (например, парсить)

U>ну какие-то мохнатые кейсы не будут работать типа иероглифы в названиях файлов


а почему не будут проходить иероглифы?

U>иначе это сложно. надо искать по форуму, уже не раз обсуждали


по каким ключевым словам?
Re[4]: переносимое консольное приложение с текстовыми аргументами в
От: _hum_ Беларусь  
Дата: 22.12.16 15:10
Оценка:
Здравствуйте, TimurSPB, Вы писали:

__>>без сторонних библиотек, минимумом усилий

TSP>Тогда просто берем и пишем код который парсерит параметр, открывает файл и читает. По каждому пункту есть примеры на stackoverflow

вы немножко не на тот вопрос отвечаете. парсить все можно. вопрос в том, что для того, чтобы открыть файл, переносимый код должен роаботать с char* , для того, чтобы парсить строку — нужно иметь wstring_t. получается противоречие, которое надо как-то разрешать.
Re[5]: переносимое консольное приложение с текстовыми аргументами в
От: TimurSPB Интернет  
Дата: 22.12.16 15:23
Оценка:
__>вы немножко не на тот вопрос отвечаете. парсить все можно. вопрос в том, что для того, чтобы открыть файл, переносимый код должен роаботать с char* , для того, чтобы парсить строку — нужно иметь wstring_t. получается противоречие, которое надо как-то разрешать.
Тогда ничего не конвертить и работать с char*. В общем случае сделать программу, которая может получать не char* кросплатформенной нельзя.
Make flame.politics Great Again!
Re[5]: переносимое консольное приложение с текстовыми аргументами в
От: uzhas Ниоткуда  
Дата: 22.12.16 15:49
Оценка:
Здравствуйте, _hum_, Вы писали:

__>по каким ключевым словам?


по своим постам пробегитесь
http://rsdn.org/forum/cpp.applied/6571664.flat
Автор: uzhas
Дата: 04.10.16

Re[6]: переносимое консольное приложение с текстовыми аргументами в
От: _hum_ Беларусь  
Дата: 22.12.16 15:56
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, _hum_, Вы писали:


__>>по каким ключевым словам?


U>по своим постам пробегитесь

U>http://rsdn.org/forum/cpp.applied/6571664.flat
Автор: uzhas
Дата: 04.10.16

U>

там не реашалась проблема, а просто общий вопрос рассматривался — почему в стандарте оставили работу с файловой системой через мультибайт.
я же ищу конкретное рабочее решение (как это сейчас принято делать).
Re[6]: переносимое консольное приложение с текстовыми аргументами в
От: _hum_ Беларусь  
Дата: 22.12.16 15:58
Оценка:
Здравствуйте, TimurSPB, Вы писали:

__>>вы немножко не на тот вопрос отвечаете. парсить все можно. вопрос в том, что для того, чтобы открыть файл, переносимый код должен роаботать с char* , для того, чтобы парсить строку — нужно иметь wstring_t. получается противоречие, которое надо как-то разрешать.

TSP>Тогда ничего не конвертить и работать с char*. В общем случае сделать программу, которая может получать не char* кросплатформенной нельзя.

ну и как мне тогда парсить командную строку типа "--file=c:\in.txt"?
Re[7]: переносимое консольное приложение с текстовыми аргуме
От: TimurSPB Интернет  
Дата: 22.12.16 16:14
Оценка:
Здравствуйте, _hum_, Вы писали:

__>Здравствуйте, TimurSPB, Вы писали:


__>>>вы немножко не на тот вопрос отвечаете. парсить все можно. вопрос в том, что для того, чтобы открыть файл, переносимый код должен роаботать с char* , для того, чтобы парсить строку — нужно иметь wstring_t. получается противоречие, которое надо как-то разрешать.

TSP>>Тогда ничего не конвертить и работать с char*. В общем случае сделать программу, которая может получать не char* кросплатформенной нельзя.

__>ну и как мне тогда парсить командную строку типа "--file=c:\in.txt"?

Например вот так:

#include <algorithm>

char* getCmdOption(char ** begin, char ** end, const std::string & option)
{
    char ** itr = std::find(begin, end, option);
    if (itr != end && ++itr != end)
    {
        return *itr;
    }
    return 0;
}

bool cmdOptionExists(char** begin, char** end, const std::string& option)
{
    return std::find(begin, end, option) != end;
}

int main(int argc, char * argv[])
{
    if(cmdOptionExists(argv, argv+argc, "-h"))
    {
        // Do stuff
    }

    char * filename = getCmdOption(argv, argv + argc, "-f");

    if (filename)
    {
        // Do interesting things
        // ...
    }

    return 0;
}

http://stackoverflow.com/questions/865668/how-to-parse-command-line-arguments-in-c
Правда пример для "-f c:\in.txt". Можно просто не поддерживать нотацию "--file=c:\in.txt"
Make flame.politics Great Again!
Отредактировано 22.12.2016 16:15 TimurSPB . Предыдущая версия .
Re[3]: переносимое консольное приложение с текстовыми аргументами в
От: andrey.desman Россия  
Дата: 22.12.16 16:17
Оценка:
Здравствуйте, _hum_, Вы писали:

__>если б было все так легко...

__>компилятор под винду дает argv[1] типа wchar_t*, тогда как при компиляции под юникс будет char*


#ifndef TEXT
#define TEXT(x) x
#endif

#ifndef _tfopen
#define _tfopen fopen
#endif

int _tmain(int argc, _TCHAR* argv[])
{
   FILE* f = _tfopen(argv[1], TEXT("r+"));
   // любить гусей
}


Другое дело, что это совсем не все проблемы
Re: переносимое консольное приложение с текстовыми аргументами в
От: Dair Россия http://www.dair.spb.ru
Дата: 22.12.16 16:23
Оценка:
Здравствуйте, _hum_, Вы писали:

__>в командной строке конcольному приложению передается имя файла. его нужно открыть (и что-то там сделать).

__>как в такой постановке написать переносимый source-code (чтоб можно было скомпилировать и на gcc под Linux, и на msvs под windows)?

В случае, если на входе один файл и на выходе один файл, можно вообще читать из stdin, писать в stdout и решать проблему типа
$ cat infile | ./myprogram > outfile


Никаких wchar_t в названиях файла при этом
С уважением,
Владимир Лебедев-Шмидтгоф
Санкт-Петербург, РФ.
Re[2]: переносимое консольное приложение с текстовыми аргументами в
От: _hum_ Беларусь  
Дата: 22.12.16 16:54
Оценка:
Здравствуйте, Dair, Вы писали:

D>Здравствуйте, _hum_, Вы писали:


__>>в командной строке конcольному приложению передается имя файла. его нужно открыть (и что-то там сделать).

__>>как в такой постановке написать переносимый source-code (чтоб можно было скомпилировать и на gcc под Linux, и на msvs под windows)?

D>В случае, если на входе один файл и на выходе один файл, можно вообще читать из stdin, писать в stdout и решать проблему типа

D>
$ cat infile | ./myprogram > outfile


D>Никаких wchar_t в названиях файла при этом


пропустили "и что-то там сделать"
Re[3]: переносимое консольное приложение с текстовыми аргументами в
От: Dair Россия http://www.dair.spb.ru
Дата: 22.12.16 17:14
Оценка:
Здравствуйте, _hum_, Вы писали:

D>>В случае, если на входе один файл и на выходе один файл, можно вообще читать из stdin, писать в stdout и решать проблему типа

__>пропустили "и что-то там сделать"

$ (cat infile | ./myprogram > outfile) && mv outfile infile
С уважением,
Владимир Лебедев-Шмидтгоф
Санкт-Петербург, РФ.
Re[4]: переносимое консольное приложение с текстовыми аргументами в
От: _hum_ Беларусь  
Дата: 22.12.16 18:12
Оценка:
Здравствуйте, Dair, Вы писали:

D>Здравствуйте, _hum_, Вы писали:


D>>>В случае, если на входе один файл и на выходе один файл, можно вообще читать из stdin, писать в stdout и решать проблему типа

__>>пропустили "и что-то там сделать"

D>
$ (cat infile | ./myprogram > outfile) && mv outfile infile


параметры того, "что сделать", в командной строке
Re[5]: переносимое консольное приложение с текстовыми аргументами в
От: Dair Россия http://www.dair.spb.ru
Дата: 22.12.16 18:14
Оценка:
Здравствуйте, _hum_, Вы писали:

__>параметры того, "что сделать", в командной строке


Ну тогда ой.

А что, в windows нет простого int main(int argc, char** argv)? Это же стандарт, вроде.
С уважением,
Владимир Лебедев-Шмидтгоф
Санкт-Петербург, РФ.
Re[6]: переносимое консольное приложение с текстовыми аргументами в
От: _hum_ Беларусь  
Дата: 22.12.16 18:43
Оценка:
Здравствуйте, Dair, Вы писали:

D>Здравствуйте, _hum_, Вы писали:


__>>параметры того, "что сделать", в командной строке


D>Ну тогда ой.


D>А что, в windows нет простого int main(int argc, char** argv)? Это же стандарт, вроде.


есть только элементами argv[i] являются зависящие от платформы мультибайтовые последовательности (ascii, utf-16, utf-8 и проч.)
Re[8]: переносимое консольное приложение с текстовыми аргуме
От: _hum_ Беларусь  
Дата: 22.12.16 20:35
Оценка:
Здравствуйте, TimurSPB, Вы писали:

TSP>Здравствуйте, _hum_, Вы писали:


__>>Здравствуйте, TimurSPB, Вы писали:


__>>>>вы немножко не на тот вопрос отвечаете. парсить все можно. вопрос в том, что для того, чтобы открыть файл, переносимый код должен роаботать с char* , для того, чтобы парсить строку — нужно иметь wstring_t. получается противоречие, которое надо как-то разрешать.

TSP>>>Тогда ничего не конвертить и работать с char*. В общем случае сделать программу, которая может получать не char* кросплатформенной нельзя.

__>>ну и как мне тогда парсить командную строку типа "--file=c:\in.txt"?

TSP>Например вот так:
  code
TSP>

TSP>#include <algorithm>

TSP>char* getCmdOption(char ** begin, char ** end, const std::string & option)
TSP>{
TSP>    char ** itr = std::find(begin, end, option);
TSP>    if (itr != end && ++itr != end)
TSP>    {
TSP>        return *itr;
TSP>    }
TSP>    return 0;
TSP>}

TSP>bool cmdOptionExists(char** begin, char** end, const std::string& option)
TSP>{
TSP>    return std::find(begin, end, option) != end;
TSP>}

TSP>int main(int argc, char * argv[])
TSP>{
TSP>    if(cmdOptionExists(argv, argv+argc, "-h"))
TSP>    {
TSP>        // Do stuff
TSP>    }

TSP>    char * filename = getCmdOption(argv, argv + argc, "-f");

TSP>    if (filename)
TSP>    {
TSP>        // Do interesting things
TSP>        // ...
TSP>    }

TSP>    return 0;
TSP>}
TSP>

TSP>http://stackoverflow.com/questions/865668/how-to-parse-command-line-arguments-in-c
TSP>Правда пример для "-f c:\in.txt". Можно просто не поддерживать нотацию "--file=c:\in.txt"

да, наверное, самый экономный по скорости вариант (без конвертаций)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.