2012-04-03 2 views
0

В качестве части назначения мне необходимо прочитать данные из двоичного файла, который состоит из int, данных типов данных. Этот двоичный файл делится на записи по 96 байт каждый. Я пытаюсь прочитать эти 96 байт в буфер char, а затем попытаться разбить их в соответствии с информацией, которую у меня есть. Но я ничего не получаю при попытке получить значения int из буфера. Можете ли вы мне помочь в этом?Операции с файлами на C++

#include<iostream> 
#include<fstream> 
#include<cstdio> 

using namespace std; 

int main() 
{ 
    char buffer[100]; 
    char *p; 
    char temp[10]; 
    int val; 
    fstream ifs,ofs; 
    ifs.open("write.bin",ios::binary); 
    if(ifs.read(buffer,96)) 
    { 
     cout << "READ" << endl; 
    }  
    p = buffer; 
    memcpy(temp,buffer,4); 
    cout << temp << endl; 
    val = atoi(temp); 
    cout << val << endl; 
} 

Я использовал strncpy также вместо memcpy. Выходной сигнал 0 для val и пробел для temp.

+9

Мы могли бы помочь, если вы покажете нам код, с которым вы столкнулись. –

+2

разве вы не забыли флаг 'ios :: in' в' ifs.open (...) '? попробуйте 'делать ifs.seekg (0);' перед вызовом 'ifs.read (...)'. – vissi2

+0

Какова структура ваших записей? Кажется, вы пытаетесь прочитать строки, где данные могут быть в двоичном представлении. – Matthias

ответ

0

atoi преобразует строки (массивы символов) в целые числа. Так что что-то вроде "42" вернет целое число 42. То, как написан ваш вопрос, похоже, что целые числа просто хранятся в двоичном виде в текстовом файле.

Простой бросок указателя буфера к нужному типу плюс разыменования должен сделать:

/* read 96 bytes into char array buffer */ 
uint32_t your_number = *(uint32_t*)buffer; 
cout << your_number << endl; 

Если вы хотите использовать memcpy, нет необходимости копировать массив символов, то можно скопировать непосредственно целое число адрес:

uint32_t your_number; 
memcpy(&your_number, buffer, 4); 
cout << your_number << endl; 

С простой C (не C++), это было бы:

uint32_t your_number; 
FILE *f = fopen("write.bin", "r"); 
fread(&your_number, sizeof(uint32_t), 1, f); /* uint32's size is 4 bytes */ 
fclose(f); 
printf("%d\n", your_number); 

Я выбрал uint32_t как тип данных, так как он гарантированно имеет 32 бита/4 байта - int может на некоторых платформах/компиляторах иметь разный размер.

0

В отличие от функций стиля C, read не возвращает число или байты, а возвращает istream&. Поэтому, чтобы проверить результат, позвоните ifs.gcount() после ifs.read().

+0

Это должен быть комментарий, поскольку он не является –

+0

Ну, может быть, я проверил программу https://gist.github.com/2293977 на моем компьютере с помощью gcc и получил непустой вывод. Проблема может быть в данных. – vissi2

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