2011-06-13 3 views
7

Мне нужно читать и писать двоичные данные в C++. Я использую классы ofstream и ifstream, но он не может читать некоторые символы, например 9,13,32. Если есть другой способ читать и писать тему.Как я могу читать двоичные данные в C++?

+2

Пожалуйста, покажите свой код. Установили ли вы 'std :: ifstream :: binary' в поле открытого режима? –

+0

Пожалуйста, покажите фрагмент кода, результат, который вы ожидаете, и полученный результат. –

+0

см. Http://stackoverflow.com/questions/5355163/writing-binary-data-stdstring-to-an-stdofstream – davka

ответ

2

Вот это программа, которая делает это:

#include <iostream> 
#include <fstream> 

int main(int argc, const char *argv[]) 
{ 
    if (argc < 2) { 
     ::std::cerr << "Usage: " << argv[0] << "<filename>\n"; 
     return 1; 
    } 
    ::std::ifstream in(argv[1], ::std::ios::binary); 
    while (in) { 
     char c; 
     in.get(c); 
     if (in) { 
     ::std::cout << "Read a " << int(c) << "\n"; 
     } 
    } 
    return 0; 
} 

Вот пример того, что запущен в Linux:

$ echo -ne '\x9\xd\x20\x9\xd\x20\n' >binfile 
$ ./readbin binfile 
Read a 9 
Read a 13 
Read a 32 
Read a 9 
Read a 13 
Read a 32 
Read a 10 
+8

Разрешение пространства имен Paranoid! :-) –

+0

@ Kerrek SB: Почему, да, см. Http://stackoverflow.com/questions/1661912/why-does-everybody-use-unanchored-namespace-declarations-ie-std-not-std * Большая улыбка * – Omnifarious

+0

Это работает, но очень неэффективно, если файл большой. Для повышения производительности используйте метод Stuard Golodetz. Для повышения производительности используйте std :: streambuf. – user763305

6

Открыть файл, используя флаг std::ios::binary, а затем использовать read и write, а не потоковые операторы.

Есть некоторые примеры здесь:

http://www.cplusplus.com/reference/iostream/istream/read/

http://www.cplusplus.com/reference/iostream/ostream/write/

+1

поясните пожалуйста. –

+2

@mehdi, он дал вам документацию и примеры. Что вы еще хотите? – Beta

+0

Посмотрите на пример в первой ссылке. Он откроет файл, прочитает содержимое и поместит содержимое в буфер символов. Буфер будет обрабатываться как массив байтов по существу. Что именно вам нужно больше объяснять? Как обрабатывать буфер и принимать значения из него? – rzetterberg

1

Это базовый пример (без проверки ошибок!):

// Required STL 
#include <fstream> 
using namespace std; 

// Just a class example 
class Data 
{ 
    int a; 
    double b; 
}; 

// Create some variables as examples 
Data x; 
Data *y = new Data[10]; 

// Open the file in input/output 
fstream myFile("data.bin", ios::in | ios::out | ios::binary); 

// Write at the beginning of the binary file 
myFile.seekp(0); 
myFile.write((char*)&x, sizeof (Data)); 

... 

// Assume that we want read 10 Data since the beginning 
// of the binary file: 
myFile.seekg(0); 
myFile.read((char*)y, sizeof (Data) * 10); 

// Remember to close the file 
myFile.close(); 
+0

Никакой компилятор, совместимый со стандартами, не будет создавать этот файл. ** 'std ::' ** 'fstream' находится в' '(no' .h'). – Johnsyweb

+0

Прикладные предложения .. извините за задержку! Почему @johnsyweb не изменил мой код? – gmas80

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