C ++ - аргументы к главному - PullRequest
0 голосов
/ 03 июля 2010

очень простой вопрос. я пытаюсь написать программу, которая выводит имена файлов файлов, перетаскиваемых на exe.

я следовал этому руководству для основных аргументов: http://publications.gbdirect.co.uk/c_book/chapter10/arguments_to_main.html

это мой код:

#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    cout<<"num arguments: "<<argc<<"\n";

    while(argc--)
        printf("%s\n", *argv++);

    cout<<"press any key";
    getchar();
    return 0;
}

но все, что выводится:

если я запускаю его без перетаскивания файлов на исполняемый файл:

количество аргументов: 1

G

нажмите любую клавишу

если я перетащу 3 файла, он выдаст:

число аргументов: 4

G

G

G

G

нажмите любую клавишу

ни имя приложения, ни имя какого-либо из файлов не начинаются с буквы "G"

в чем проблема?

спасибо!

Ответы [ 4 ]

5 голосов
/ 03 июля 2010

Вы получаете только первую букву, потому что вы смешиваете Unicode, а не.Я не могу объяснить Gs извините (если все ваши файлы не находятся на диске G:?), Но вы увидите полные имена файлов вместо

while(argc--)
    _tprintf(_T("%s\n"), *argv++);

.

Запоздалая мысль и битыена это ответом sbi: я не могу найти _tcout для использования в качестве

_tcout << *argv++;

вместо этого, если вы хотите остаться в C ++ - я думаю, вам придется определить его, например,

#ifdef _UNICODE
#define _tcin wcin
#define _tcout wcout
#define _tcerr wcerr
#define _tclog wclog
#else
#define _tcin cin
#define _tcout cout
#define _tcerr cerr
#define _tclog clog
#endif

хотя это и есть C ++, их, вероятно, не следует определять, а что-то еще, и я не уверен на 100%, что.

1 голос
/ 03 июля 2010

argv[0] всегда имя исполняемого файла. (Это означает, что argc > 0 всегда верно.) Если вы хотите выводить широкие символы (я думаю, _TCHAR отображается на wchar_t, BICBWT), вы не должны использовать узкий вывод. В C ++ вывод осуществляется с использованием потоков вывода. Широкий поток вывода консоли составляет std::wcout.

#include <iostream>

//Beware, brain-compiled code ahead!
template< typename InpIt >
void output(InpIt begin, InpIt end)
{
  while(begin != end)
    std::wcout << *begin++ << L'\n';
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::wcout << L"num arguments: " << std::argc << L'\n';

    output(argv+1, argv+argc)

    return 0;
}

Как упоминает Rup, _TCHAR меняет свое значение (char или wchar_t) в зависимости от некоторого определения.

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

Однако, если вам действительно нужно переключиться, вам нужно переключаться между узкими и широкими консольными потоками самостоятельно. (Это верно только для консольных потоковых объектов, кстати. Для ваших собственных потоков, например, файловых потоков, вы можете просто использовать _TCHAR и позволить компилятору выяснить остальное: std::basic_ofstream<_TCHAR>.) Один из способов сделать это будет чертой класса:

//Beware, brain-compiled code ahead!
template< typename Char >
struct console_stream_traits; // leave undefined

template<>
struct console_stream_traits<char> {
  typedef std::basic_ostream<char> ostream;
  typedef std::basic_istream<char> istream;
  std::basic_ostream<char>& cout = std::cout;
  std::basic_ostream<char>& cerr = std::cerr;
  std::basic_ostream<char>& clog = std::clog;
  std::basic_istream<char>& cin  = std::cin;
};

template<>
struct console_stream_traits<wchar_t> {
  typedef std::basic_ostream<wchar_>  ostream;
  typedef std::basic_istream<wchar_>  istream;
  std::basic_ostream<wchar_t>& cout = std::wcout;
  std::basic_ostream<wchar_t>& cerr = std::wcerr;
  std::basic_ostream<wchar_t>& clog = std::wclog;
  std::basic_istream<wchar_t>& cin  = std::wcin;
};

typedef console_stream_traits<_TCHAR> my_ostream;
typedef my_console_stream_traits::ostream    my_ostream;
typedef my_console_stream_traits::ostream    my_ostream;

my_ostream& my_cout = my_console_stream_traits::cout;
my_ostream& my_cerr = my_console_stream_traits::cerr;
my_ostream& my_clog = my_console_stream_traits::clog;
my_istream& my_cin  = my_console_stream_traits::cin;

При этом цикл в функции output(), приведенной выше, станет:

while(begin != end)
  my_cout << *begin++ << _T('\n');
0 голосов
/ 03 июля 2010

Просто используйте функцию ASCII 'main', и все будет в порядке.Измените

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

на

int main(int argc, char *argv[])
0 голосов
/ 03 июля 2010

Используйте это:

while(argc--)
    printf("%s\n", argv[argc]);
...