Lectura en 4 bytes a la vez.

Tengo un archivo grande lleno de enteros en los que estoy cargando. Acabo de empezar a usar C ++, y estoy probando el flujo de archivos. Por todo lo que he leído, parece que solo puedo leer en bytes, así que tuve que configurar una matriz de caracteres y luego convertirla en un puntero int.

¿Hay alguna forma de leer 4 bytes a la vez y eliminar la necesidad de la matriz char?

const int HRSIZE = 129951336; //The size of the table char bhr[HRSIZE]; //The table int *dwhr; int main() { ifstream fstr; /* load the handranks.dat file */ std::cout << "Loading table.dat...\n"; fstr.open("table.dat"); fstr.read(bhr, HRSIZE); fstr.close(); dwhr = (int *) bhr; } 

Para leer un solo número entero, pase la dirección del número entero a la función de lectura y asegúrese de que solo lea sizeof int bytes.

 int myint; //... fstr.read(reinterpret_cast(&myint), sizeof(int)); 

Es posible que también necesite abrir el archivo en modo binario

 fstr.open("table.dat", std::ios::binary); 

Para leer por 4 bytes desde ifstream se podría sobrecargar el operator>> siguiente manera (en realidad es una especialización parcial de la plantilla de clase basic_istream , por lo que istream_iterator podría usar el operator>> . La clase basic_ifstream se usa aquí para heredar toda la funcionalidad de flujo de entrada del archivo eso):

 #include  typedef unsigned int uint32_t; struct uint32_helper_t {}; namespace std { template class basic_istream : public basic_ifstream { public: explicit basic_istream(const char* filename, ios_base::openmode mode ) : basic_ifstream( filename, mode ) {} basic_istream& operator>>(uint32_t& data) { read(&data, 1); return *this; } }; } // namespace std {} 

Entonces podrías usarlo de la siguiente manera:

 std::basic_istream my_file( FILENAME, std::ios::in|std::ios::binary ); // read one int at a time uint32_t value; my_file >> value; // read all data in file std::vector data; data.assign( std::istream_iterator(my_file), std::istream_iterator() ); 

tu puedes hacer

 int i; fstr.read((int*)&i, sizeof(int)); 

¿Es esto lo que quieres decir? Por cierto, su código (y esto) asume la endianness nativa de los datos.

 const int HRSIZE = 129951336; //The size of the table int dhr[HRSIZE/sizeof(int)]; //The table int main() { ifstream fstr; /* load the handranks.dat file */ std::cout << "Loading table.dat...\n"; fstr.open("table.dat"); fstr.read((char*)dhr, HRSIZE); fstr.close(); } 

Podrías probar esto:

 const int HRSIZE = 129951336/sizeof(int); //The size of the table int bhr[HRSIZE]; //The table int main(int argc, char *argv[]) { ifstream fstr; /* load the handranks.dat file */ std::cout << "Loading table.dat...\n"; fstr.open("table.dat"); for (int i=0; i