в командной строке конcольному приложению передается имя файла. его нужно открыть (и что-то там сделать).
как в такой постановке написать переносимый source-code (чтоб можно было скомпилировать и на gcc под Linux, и на msvs под windows)?
Re: переносимое консольное приложение с текстовыми аргументами в
Здравствуйте, _hum_, Вы писали:
__>в командной строке конcольному приложению передается имя файла. его нужно открыть (и что-то там сделать). __>как в такой постановке написать переносимый source-code (чтоб можно было скомпилировать и на gcc под Linux, и на msvs под windows)?
argv[1], fopen/fread, ifstream, ..., PROFIT
Re[2]: переносимое консольное приложение с текстовыми аргументами в
Здравствуйте, 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]: переносимое консольное приложение с текстовыми аргументами в
Здравствуйте, _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]: переносимое консольное приложение с текстовыми аргументами в
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, _hum_, Вы писали:
__>>если б было все так легко...
__>>
__>>int _tmain(int argc, _TCHAR* argv[])
__>>
U>вы называете это переносимым кодом?
нет, я показываю, что в зависимости от настроект компилятора, могут быть разные типы у аргумента
__>>компилятор под винду дает argv[1] типа wchar_t*, тогда как при компиляции под юникс будет char* U>и под виндой и под линуксами доступны сигнатуры (точки входа) 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: переносимое консольное приложение с текстовыми аргументами в
Здравствуйте, _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!
Re[2]: переносимое консольное приложение с текстовыми аргументами в
Здравствуйте, 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]: переносимое консольное приложение с текстовыми аргументами в
__>без сторонних библиотек, минимумом усилий
Тогда просто берем и пишем код который парсерит параметр, открывает файл и читает. По каждому пункту есть примеры на stackoverflow
Make flame.politics Great Again!
Re[4]: переносимое консольное приложение с текстовыми аргументами в
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, _hum_, Вы писали:
__>>без сторонних библиотек, минимумом усилий
U>минимум усилий — это работать с char* и ничего не конвертить
тогда не получится посимвольный анализ строк делать (например, парсить)
U>ну какие-то мохнатые кейсы не будут работать типа иероглифы в названиях файлов
а почему не будут проходить иероглифы?
U>иначе это сложно. надо искать по форуму, уже не раз обсуждали
по каким ключевым словам?
Re[4]: переносимое консольное приложение с текстовыми аргументами в
Здравствуйте, TimurSPB, Вы писали:
__>>без сторонних библиотек, минимумом усилий TSP>Тогда просто берем и пишем код который парсерит параметр, открывает файл и читает. По каждому пункту есть примеры на stackoverflow
вы немножко не на тот вопрос отвечаете. парсить все можно. вопрос в том, что для того, чтобы открыть файл, переносимый код должен роаботать с char* , для того, чтобы парсить строку — нужно иметь wstring_t. получается противоречие, которое надо как-то разрешать.
Re[5]: переносимое консольное приложение с текстовыми аргументами в
__>вы немножко не на тот вопрос отвечаете. парсить все можно. вопрос в том, что для того, чтобы открыть файл, переносимый код должен роаботать с char* , для того, чтобы парсить строку — нужно иметь wstring_t. получается противоречие, которое надо как-то разрешать.
Тогда ничего не конвертить и работать с char*. В общем случае сделать программу, которая может получать не char* кросплатформенной нельзя.
Make flame.politics Great Again!
Re[5]: переносимое консольное приложение с текстовыми аргументами в
там не реашалась проблема, а просто общий вопрос рассматривался — почему в стандарте оставили работу с файловой системой через мультибайт.
я же ищу конкретное рабочее решение (как это сейчас принято делать).
Re[6]: переносимое консольное приложение с текстовыми аргументами в
Здравствуйте, TimurSPB, Вы писали:
__>>вы немножко не на тот вопрос отвечаете. парсить все можно. вопрос в том, что для того, чтобы открыть файл, переносимый код должен роаботать с char* , для того, чтобы парсить строку — нужно иметь wstring_t. получается противоречие, которое надо как-то разрешать. TSP>Тогда ничего не конвертить и работать с char*. В общем случае сделать программу, которая может получать не char* кросплатформенной нельзя.
ну и как мне тогда парсить командную строку типа "--file=c:\in.txt"?
Re[7]: переносимое консольное приложение с текстовыми аргуме
Здравствуйте, _hum_, Вы писали:
__>Здравствуйте, TimurSPB, Вы писали:
__>>>вы немножко не на тот вопрос отвечаете. парсить все можно. вопрос в том, что для того, чтобы открыть файл, переносимый код должен роаботать с char* , для того, чтобы парсить строку — нужно иметь wstring_t. получается противоречие, которое надо как-то разрешать. TSP>>Тогда ничего не конвертить и работать с char*. В общем случае сделать программу, которая может получать не char* кросплатформенной нельзя.
__>ну и как мне тогда парсить командную строку типа "--file=c:\in.txt"?
Например вот так:
Здравствуйте, _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: переносимое консольное приложение с текстовыми аргументами в
Здравствуйте, _hum_, Вы писали:
__>в командной строке конcольному приложению передается имя файла. его нужно открыть (и что-то там сделать). __>как в такой постановке написать переносимый source-code (чтоб можно было скомпилировать и на gcc под Linux, и на msvs под windows)?
В случае, если на входе один файл и на выходе один файл, можно вообще читать из stdin, писать в stdout и решать проблему типа
$ cat infile | ./myprogram > outfile
Никаких wchar_t в названиях файла при этом
Re[2]: переносимое консольное приложение с текстовыми аргументами в
Здравствуйте, Dair, Вы писали:
D>Здравствуйте, _hum_, Вы писали:
__>>в командной строке конcольному приложению передается имя файла. его нужно открыть (и что-то там сделать). __>>как в такой постановке написать переносимый source-code (чтоб можно было скомпилировать и на gcc под Linux, и на msvs под windows)?
D>В случае, если на входе один файл и на выходе один файл, можно вообще читать из stdin, писать в stdout и решать проблему типа D>
$ cat infile | ./myprogram > outfile
D>Никаких wchar_t в названиях файла при этом
пропустили "и что-то там сделать"
Re[3]: переносимое консольное приложение с текстовыми аргументами в
Здравствуйте, _hum_, Вы писали:
D>>В случае, если на входе один файл и на выходе один файл, можно вообще читать из stdin, писать в stdout и решать проблему типа __>пропустили "и что-то там сделать"
Здравствуйте, Dair, Вы писали:
D>Здравствуйте, _hum_, Вы писали:
D>>>В случае, если на входе один файл и на выходе один файл, можно вообще читать из stdin, писать в stdout и решать проблему типа __>>пропустили "и что-то там сделать"
D>
Здравствуйте, Dair, Вы писали:
D>Здравствуйте, _hum_, Вы писали:
__>>параметры того, "что сделать", в командной строке
D>Ну тогда ой.
D>А что, в windows нет простого int main(int argc, char** argv)? Это же стандарт, вроде.
есть только элементами argv[i] являются зависящие от платформы мультибайтовые последовательности (ascii, utf-16, utf-8 и проч.)
Re[8]: переносимое консольное приложение с текстовыми аргуме
Здравствуйте, TimurSPB, Вы писали: TSP>Здравствуйте, _hum_, Вы писали: __>>Здравствуйте, TimurSPB, Вы писали: __>>>>вы немножко не на тот вопрос отвечаете. парсить все можно. вопрос в том, что для того, чтобы открыть файл, переносимый код должен роаботать с char* , для того, чтобы парсить строку — нужно иметь wstring_t. получается противоречие, которое надо как-то разрешать. TSP>>>Тогда ничего не конвертить и работать с char*. В общем случае сделать программу, которая может получать не char* кросплатформенной нельзя. __>>ну и как мне тогда парсить командную строку типа "--file=c:\in.txt"? TSP>Например вот так: