С
long int *x=new long int[1424];
Вы объявляете указатель, указывающий на массив 1424 long int
. Но с чтением
in.read((char*)x,1424);
Вы читаете 1424 байт.
И в цикле вы перебираете массив, но добавляете 4 к индексу, поэтому только каждый из четырех элементов x
отбрасывается.
Вы должны в первую очередь думать о том, что, возможно, long
является восемь байт на 64-разрядных машинах. Вам также не нужно выделять массив динамически. И массив должен содержать 356 записей, так же, как при написании файла. Затем вы можете прочитать sizeof(x)
байт в запросе на чтение. И, наконец, в зацикливание, цикл от 0 до sizeof(x)/sizeof(x[0])
:
long int x[356];
ifstream in("h.h",ios::binary|ios::in);
in.read((char*) x, sizeof(x));
for(int y = 0; y < (sizeof(x)/sizeof(x[0])); y++)
{
}
Если вы хотите прочитать содержимое как
long int
в
std::vector
, есть на самом деле «проще» способом, используя итераторы и стандарт C++ алгоритмы:
std::vector<long int> e1;
std::ifstream in("h.h", std::ios::binary | std::ios::in);
std::copy_n(std::istream_iterator<long int>(in),
356,
std::back_inserter(e1));
Приведенные выше утверждения объявляет вектор, открывает файл и копирует 356 long int
записей из файла в вектор e1
.
См.
std::istream_iterator
,
std::back_inserter
, и, конечно,
std::copy_n
. Решение
выше C++ не работает, поэтому я экспериментировал с другим:
std::vector<long> v(356);
std::ifstream in("h.h", std::ios::binary);
std::for_each(std::begin(v), std::end(v), [&in](long& v) {
in.read(reinterpret_cast<char*>(&v), sizeof(v));
});
Вышеуказанный раствор был испытан с this program, и это работает для меня.
Что означают вышеприведенные операторы, создает вектор, содержащий записи 356 long
, открывает файл и считывает в вектор одну запись за раз.
Помните, что 'long int' может иметь разный размер, чем 4. Используйте' sizeof (long int) '. –
U использует приложение ios ::, которое добавляет данные, вы уверены, что не читаете старые данные? – hetepeperfan
Я уверен, почему я хотел использовать ios :: app. – user2090617