2014-12-21 2 views
0

У меня есть двоичный файл,Fread на C++ Vecotor

FILE *fp; 
fp = fopen("file_name.data", "rb"); 

который может быть успешно считаны с помощью Fread() со следующим кодом C

int S = 8; 
int *table = (int*)malloc(S*sizeof(int)); 
fread(table, S*sizeof(int), 1, fp); 

Но когда я прочитал файл в векторе C++, неправильный результат

vector<int> table; 
table.resize(S); 
fread(&table[0],table.size(), 1, fp); 

Есть ли что-то неправильное с вышеуказанным кодом?.

+0

Почему вы используете код 'stdio' для C++ вместе с' malloc'? Разумеется, 'iostreams' и' new' - это порядок дня –

ответ

4

table.size() возвращает количество элементов в std::vector, а не количество байтов. Вам все равно нужно умножить это на размер каждого элемента, как и в коде C.

fread(&table[0],table.size()*sizeof(int), 1, fp); 
+1

Дебатируемый, но не 'table.size() * sizeof (table [0])' лучший подход? Я знаю, что они оба выполняют одно и то же, но с точки зрения удобочитаемости я всегда считаю его более удобочитаемым. – Freddy

+0

@ Фредди: Я согласен с тобой. Есть и другие улучшения, которые могут быть сделаны. См. Другие ответы ... – Blastfurnace

4

Ваш fread должен быть: -

fread (&table[0], sizeof(vector<int>::value_type), table.size(), fp); 
// OR 
fread (&table[0], sizeof(int), table.size(), fp); 
3

И, как представляется, не так (хотя версия C выглядит, как он будет работать).

См:http://www.tutorialspoint.com/c_standard_library/c_function_fread.htm

Попробуйте эти:

int S = 8; 
int *table = (int*)malloc(S*sizeof(int)); 
fread(table, sizeof(int), S, fp); 

vector<int> table; 
table.resize(S); 
fread(&table[0], sizeof(int), table.size(), fp);