2013-02-20 2 views
0

// Значения массива устанавливаются после нескольких расчетовзначения errorreading из двоичного файла C++

long int a1[356]; 
long int b2[356]; 
long int c3[356]; 

// в двоичном пишешь файл

ofstream output("h.h",ios::binary|ios::out|ios::app); 

output.write((char*)a1,356*4); 
output.write((char*)b2,356*4); 
output.write((char*)c3,356*4); 

// читать

long int *x=new long int[1424]; 
ifstream in("h.h",ios::binary|ios::in); 

in.read((char*)x,1424); 

vector<long int> e1; 
vector<long int> e2; 
vector<long int> e3; 

for(int y=;y<=1424;y=y+4) 
{ 
// e1.push_back((int)x[i]); 

} 

Я использую вышеуказанный метод для чтения целых чисел, записанных в двоичный файл, я не могу получить значения как сохраненные. , может кто-нибудь указать, где проблема?

Спасибо!

+1

Помните, что 'long int' может иметь разный размер, чем 4. Используйте' sizeof (long int) '. –

+0

U использует приложение ios ::, которое добавляет данные, вы уверены, что не читаете старые данные? – hetepeperfan

+0

Я уверен, почему я хотел использовать ios :: app. – user2090617

ответ

1

С

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, открывает файл и считывает в вектор одну запись за раз.

+0

Спасибо. Я понял, что раньше, но не смог найти способ рассмотреть и другие три байта. Какие-либо предложения ? – user2090617

+0

@ user2090617 Я обновил свой ответ несколько раз, раз с более «наивным» решением C-ish и один раз с более идиоматическим чистым решением на C++. –

+0

Я пробовал использовать copy_n, тест возвращал значения мусора @ Joachim – user2090617

Смежные вопросы