0

非常基本的问题。我尝试编写一个程序,输出拖到 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;
}

但它输出的只是:

如果我在不将文件拖放到 exe 的情况下运行它:

参数数量:1

G

按任意键

如果我拖放 3 个文件,它将输出:

参数数量:4

G

G

G

G

按任意键

应用程序名称和任何文件的名称都不是以“G”开头

有什么问题?

谢谢!

4

4 回答 4

5

你只得到第一个字母是因为你混合了 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% 确定是什么。

于 2010-07-03T12:35:21.727 回答
1

argv[0]始终是可执行文件的名称。(这意味着argc > 0总是如此。)如果你想输出宽字符(我认为_TCHAR映射到wchar_tBICBWT),你不能使用窄输出。在 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');
于 2010-07-03T12:42:47.203 回答
0

只需使用 ASCII 'main' 函数,一切都会好起来的。改变

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

int main(int argc, char *argv[])
于 2010-07-03T12:44:38.807 回答
-1

用这个:

while(argc--)
    printf("%s\n", argv[argc]);
于 2010-07-03T12:23:12.350 回答