[Решено]Как сделать грамотнее ввод входного/выходного файла программы из командной строки? (C++)

Модератор: Модераторы разделов

Аватара пользователя
ffldove
Сообщения: 480
Статус: Keep It Simple, Stupid
ОС: RFRemix 14

[Решено]Как сделать грамотнее ввод входного/выходного файла программы из командной строки?

Сообщение ffldove »

Участок кода на C++ в котором открываются входной и выходной файл введеные в командной строке.

Код: Выделить всё

int main(int argc, char** argv){
  char* read_file="SPR.000"; //файл открывающийся по умолчанию, если бы небыли заданны мараметры для чтения
  char* write_file="SPR.csv"; //файл открывающийся по умолчанию, если бы небыли заданны мараметры для записи
  char* csv=".csv"; //раширение выходного файла
  if (argc>=2) read_file=argv[1]; //если был введен первый параметр то это имя читаемого файла
  if (argc>=3) write_file=strcat(argv[2], csv); //если был введен второй параметр то это имя записываеиого файла
  fstream spr_read(read_file, ios_base::in); //открываем файл для чтения
  fstream spr_write(write_file, ios_base::out); //открываем файл для записи

/*Работа с файлами*/

}

Понимаю что сделано через, ну в общем не лучшим образом. Как сделать грамотнее?
Плюс еще при компиляции вылазят предупреждения:

Код: Выделить всё

1: In function 'int main(int, char**)':
2: warning: deprecated conversion from string constant to 'char*'
3: warning: deprecated conversion from string constant to 'char*'
4: warning: deprecated conversion from string constant to 'char*'
I learned something today
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: [Решено]Как сделать грамотнее ввод входного/выходного файла программы из командной строки?

Сообщение watashiwa_daredeska »

Строковые константы имеют тип char const*, а не char*.

ffldove писал(а):
09.07.2010 13:50
write_file=strcat(argv[2], csv);
Это просто ужасно. Память кто выделять будет? strcat уж точно не будет этого делать. Это во-первых.

Во-вторых, в современных шеллах есть такая штука, как автодополнение и (сюрприз, сюрприз!) имя файла дополняется вместе с суффиксом. Так что, принудительное дописывание суффикса к имени — махровые суеверия времён MS-DOS.

А в остальном, ничего так, сойдет.
Спасибо сказали:
Аватара пользователя
ffldove
Сообщения: 480
Статус: Keep It Simple, Stupid
ОС: RFRemix 14

Re: [Решено]Как сделать грамотнее ввод входного/выходного файла программы из командной строки?

Сообщение ffldove »

watashiwa_daredeska писал(а):
09.07.2010 14:05
Строковые константы имеют тип char const*, а не char*.

Понял.

ffldove писал(а):
09.07.2010 13:50
write_file=strcat(argv[2], csv);
Это просто ужасно. Память кто выделять будет? strcat уж точно не будет этого делать. Это во-первых.

Не понял, а зачем выделать память write_file то уже есть?

Во-вторых, в современных шеллах есть такая штука, как автодополнение и (сюрприз, сюрприз!) имя файла дополняется вместе с суффиксом. Так что, принудительное дописывание суффикса к имени — махровые суеверия времён MS-DOS.

Автодополнение - это которое по клавише Tab? Это не подходит, так как файла для записи может и не быть изначально и его потребуется создать именно csv, а пользователь врятли введет в командной строке именно "имя".csv (проверку ввел или нет сделаю потом, а щас лучше перестрахуюсь).
I learned something today
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: [Решено]Как сделать грамотнее ввод входного/выходного файла программы из командной строки?

Сообщение watashiwa_daredeska »

ffldove писал(а):
09.07.2010 14:18
Не понял, а зачем выделать память write_file то уже есть?
write_file — указатель. На что он указывает? Откуда strcat знает про write_file? Почитайте man strcat, там написано, как она работает. Подумайте над тем, что и куда на самом деле передается и где что делается в этой строке.

ffldove писал(а):
09.07.2010 14:18
пользователь врятли введет в командной строке именно "имя".csv
В среде *nix не принято додумывать такие вещи за пользователя. Мало ли, как я захочу назвать файл, может .csv мне вовсе не нужен (возможно, я сгенерил имя каким-нибудь mktemp).
Спасибо сказали:
Аватара пользователя
ffldove
Сообщения: 480
Статус: Keep It Simple, Stupid
ОС: RFRemix 14

Re: [Решено]Как сделать грамотнее ввод входного/выходного файла программы из командной строки?

Сообщение ffldove »

watashiwa_daredeska писал(а):
09.07.2010 14:31
ffldove писал(а):
09.07.2010 14:18
пользователь врятли введет в командной строке именно "имя".csv
В среде *nix не принято додумывать такие вещи за пользователя. Мало ли, как я захочу назвать файл, может .csv мне вовсе не нужен (возможно, я сгенерил имя каким-нибудь mktemp).

Про это я что то не подумал.
I learned something today
Спасибо сказали:
Аватара пользователя
agentprog
Сообщения: 362
Статус: Ad Astra per aspera
ОС: openSUSE 11.4, Arch

Re: [Решено]Как сделать грамотнее ввод входного/выходного файла программы из командной строки?

Сообщение agentprog »

ffldove писал(а):
09.07.2010 13:50
Участок кода на C++


ffldove писал(а):
09.07.2010 13:50
char*


это лично мое имхо, к тому же я не знаю какие именно цели Вы преследуете, но не меньше ли геморроя будет, если воспользоваться std::string?
No problems - just solutions!
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: [Решено]Как сделать грамотнее ввод входного/выходного файла программы из командной строки?

Сообщение watashiwa_daredeska »

agentprog писал(а):
09.07.2010 17:21
не меньше ли геморроя будет, если воспользоваться std::string?
В данном случае — не меньше. Ибо это ведь C++, которого в детстве головой роняли. Всякие там fstream принимают имя файла как char const*, в результате неисправимой родовой черепно-мозговой травмы, а main принимает аргументы как char**, вместо std::vector<std::string>, для совместимости с C.
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: [Решено]Как сделать грамотнее ввод входного/выходного файла программы из командной строки?

Сообщение Crazy »

Код: Выделить всё

    std::string str = ARGV[1];
    std::cout<< str <<std::endl;
    const char* sss = str.c_str();
        std::ifstream    input(sss);

Desipere in loco
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5413
ОС: Gentoo

Re: [Решено]Как сделать грамотнее ввод входного/выходного файла программы из командной строки?

Сообщение /dev/random »

Кстати, если вы не делаете seek(), то в качестве файлов по-умолчанию более принято использовать stdin и stdout. А если делаете, то обязать пользователя вводить их имена и выдавать ошибку в противном случае.
Спасибо сказали:
Аватара пользователя
ffldove
Сообщения: 480
Статус: Keep It Simple, Stupid
ОС: RFRemix 14

Re: [Решено]Как сделать грамотнее ввод входного/выходного файла программы из командной строки?

Сообщение ffldove »

Crazy писал(а):
09.07.2010 18:31

Код: Выделить всё

    std::string str = ARGV[1];
    std::cout<< str <<std::endl;
    const char* sss = str.c_str();
        std::ifstream    input(sss);

Не совсем понял что вы хотели сказать.
I learned something today
Спасибо сказали:
Аватара пользователя
agentprog
Сообщения: 362
Статус: Ad Astra per aspera
ОС: openSUSE 11.4, Arch

Re: [Решено]Как сделать грамотнее ввод входного/выходного файла программы из командной строки?

Сообщение agentprog »

ffldove писал(а):
09.07.2010 21:16
Не совсем понял что вы хотели сказать.

скорее всего то, что std::string довольно адекватно работает с C-строками (которые char *)
No problems - just solutions!
Спасибо сказали:
Аватара пользователя
ffldove
Сообщения: 480
Статус: Keep It Simple, Stupid
ОС: RFRemix 14

Re: [Решено]Как сделать грамотнее ввод входного/выходного файла программы из командной строки?

Сообщение ffldove »

/dev/random писал(а):
09.07.2010 21:08
Кстати, если вы не делаете seek(), то в качестве файлов по-умолчанию более принято использовать stdin и stdout. А если делаете, то обязать пользователя вводить их имена и выдавать ошибку в противном случае.

Первое есть но использовал seekp, до второго еще руки не дошли.
I learned something today
Спасибо сказали: