非常基本的问题。我尝试编写一个程序,输出拖动到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:
num arguments:1
按任意键
如果我拖放3个文件,它将输出:
num arguments:4
按任意键
应用程序名称和任何文件的名称都不以“G”开头
问题是什么?
谢谢!
答案 0 :(得分: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%肯定是什么。
答案 1 :(得分:1)
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
)。
首先:你真的需要这种切换吗?实际上,当你需要宽字符时,通常你真的需要它们,而且程序将无法正确处理窄字符。<登记/> 因此,您很可能只能满足纯粹的宽字符,摆脱切换,并使用上面编写的代码。
但是,如果您确实需要切换,则需要自己在狭窄和广泛的控制台流之间切换。 (这仅适用于控制台流对象,BTW。对于您自己的流,例如文件流,您可以使用_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');
答案 2 :(得分:0)
只需使用ASCII'main'功能,一切都会好的。变化
int _tmain(int argc, _TCHAR* argv[])
到
int main(int argc, char *argv[])
答案 3 :(得分:-1)
使用此:
while(argc--)
printf("%s\n", argv[argc]);