Если вы заполняете поток файлов () после открытия файла, функция imbue () автоматически завершается с ошибкой.
Вы должны выполнить imbue (), а затем открыть файл:
std::basic_ifstream<float, traits_type> input;
std::locale loc(std::locale(), new cvt());
input.imbue(loc);
// Open after the imbue()
input.open( pszDataFile, std::ios::binary );
Ваша вторая проблема - вы путаете двоичный файл терминов:
Этот код считывает поток текстовых данных (то есть текстовый файл), используя оператор >>
std::copy(std::istreambuf_iterator<float>(input),
std::istreambuf_iterator<float>( ),
std::back_inserter(fvBuffer));
Использование std::ios::binary
при открытии файла влияет только на то, как генерируется «последовательность конца строки» (EOLS), оно не имеет никакого отношения к природе файла. Хотя, поскольку вы указываете это, символ '\ n' не преобразуется в EOLS, что полезно при создании двоичных файлов.
Так что короткий ответ - лучше читать текстовый поток из файла.
Причина, по которой ваш вектор короче ожидаемого, заключается в том, что при чтении потока произошла ошибка и в результате он перестал отвечать на запросы на чтение.
Кроме того, я не могу заставить ваш код компилироваться.
Так что вы делаете что-то еще нестандартное.