int _tmain(int argc, char** argv)
{
FILE* file1=fopen(argv[1],"r");
FILE* file2=fopen(argv[2],"w");
}
Кажется, как будто только первая буква аргументов получена... Я не добираюсь почему!
std::cout<<"Opening "<<strlen(argv[1])<<" and writing to "<<strlen(argv[2])<<std::endl;
выводы 1 и 1 несмотря ни на что. (в MSVC 2010)
Это не char
, а wchar_t
при компиляции с установленным UNICODE
.
Он компилируется как wmain
. Линкер просто не замечает, что сигнатура другая, потому что это "export C" функция и в ее имени не указаны типы аргументов.
Так что должно быть int _tmain(int argc, TCHAR** argv)
Преобразование в char хитрое и не всегда корректное - функция, предоставляемая Win32, корректно переведет только текущую ANSI кодовую страницу.
Если вы хотите использовать UTF-8 во внутренних компонентах приложения, то вам придется искать конвертер в другом месте (например, в Boost)
Ваша строка аргумента входит как UNICODE.
См. Этот вопрос
Не используйте тип данных char
в Windows, это нарушает поддержку Unicode . Вместо этого используйте «широкие» функции. В C ++ избегайте stdio C, используйте вместо этого файловые потоки:
#include <cstdlib>
#include <string>
#include <fstream>
int wmain(int argc, wchar_t** argv) {
if (argc <= 2) return EXIT_FAILURE;
const std::wstring arg1 = argv[1];
const std::wstring arg2 = argv[2];
std::ifstream file1(arg1.c_str());
std::ofstream file2(arg2.c_str());
}