C++ vector.assign (содержимое массива char) работает в WinXP-32, не работает в Win10-64; Зачем?
В этой теме StackExchange: первый ответ и последний комментарий к этому ответу - я научился назначать содержимое моего массива char (который я только что прочитал из файла) в свой вектор. Следующий код отлично работает в Windows XP, 32-разрядная версия Visual Studio 2010, но не работает в Win10, 64-разрядная версия Studio 2012. Оба проекта используют набор символов Unicode. Содержимое файла myConfig.txt (разделено вкладками):
слова 3 Мобиус Лагранж Гаусс
Я полный нуб, поэтому, если какая-то ошибка кажется слишком глупой, чтобы кто-то ее совершил, продолжайте и предположите, что я ее сделал.
Код:
#include "stdafx.h"
#include <windows.h>
#include <vector>
#include <iterator>
#include <string.h>
#include <wchar.h>
#include <tchar.h>
using namespace std;
vector<wchar_t> wvec;
int n;
wchar_t ss[256];
FILE* pfile;
int _tmain(int argc, _TCHAR* argv[])
{
fopen_s(&pfile,"myConfig.txt","r");
fwscanf_s(pfile,L"%ls",&ss);
wprintf(L"var name is %ls\n",ss);
fwscanf_s(pfile,L"%d",&n);
printf("num words is %d\n",n);
for (int i=0; i<3; i++) {
fwscanf_s(pfile,L"%ls",&ss);
wvec.clear();
n=wcslen(ss);
wprintf(L"vec empty %ls length %d\n",vec,vec.size());
wvec.assign(ss,ss+n+1); // +1 to contain null char
wprintf(L"vec sz %d filled %ls\n",wvec.size(),wvec);
}
printf("press Enter to finish\n");
getchar();
return 0;
}
На машине с Win10 вывод отчасти говорит "vec sz 7 заполнен???", когда я запускаю / отлаживаю из среды разработки. Когда я запускаю exe-файл в папке x64\Release, соответствующая строка выводит сообщение "vec sz 5 заливка???", а содержимое myConfig.txt точно такое же.
На машине XP выход идеален.
1 ответ
Наконец-то ответил на мой собственный вопрос: RTFM. Так не должно быть
fscanf_s(pfile,"%s",&s);
Так должно быть
fscanf_s(pfile,"%s",s, _countof(s));
Я не знаю, почему это работает в XP (удобно # байт / символ?), Но, что угодно.