Чтение по 4 байта за раз - PullRequest
7 голосов
/ 04 июня 2010

У меня есть большой файл, полный целых чисел, в который я загружаюсь. Я только начал использовать C ++ и пробую вещи из файлового потока. Из всего, что я прочитал, похоже, что я могу читать только в байтах, поэтому мне пришлось настроить массив символов, а затем привести его как указатель типа int.

Есть ли способ прочитать 4 байта за раз и устранить необходимость в массиве символов?

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;    
}

Ответы [ 5 ]

16 голосов
/ 04 июня 2010

Чтобы прочитать одно целое число, передайте адрес целого числа функции чтения и убедитесь, что вы читаете только sizeof int байт.

int myint;

//...

fstr.read(reinterpret_cast<char*>(&myint), sizeof(int));

Вам также может понадобиться открыть файл в двоичном режиме

fstr.open("table.dat", std::ios::binary);
4 голосов
/ 04 июня 2010

Чтобы прочитать 4 байта из ifstream, вы можете перегрузить operator>> следующим образом (на самом деле это частичная специализация шаблона класса basic_istream, поэтому istream_iterator может использовать operator>> из него. Класс basic_ifstreamиспользуется здесь для наследования всех функциональных возможностей потока входного файла от него):

#include <fstream>

typedef unsigned int uint32_t;    
struct uint32_helper_t {};

namespace std {
template<class traits>
class basic_istream<uint32_helper_t, traits> : public basic_ifstream<uint32_t> {
public:
    explicit basic_istream<uint32_helper_t, traits>(const char* filename, 
        ios_base::openmode mode ) : basic_ifstream<uint32_t>( filename, mode ) {}

    basic_istream<uint32_helper_t, traits>& operator>>(uint32_t& data) {
        read(&data, 1);
        return *this;
    }
};
} // namespace std {}

Тогда вы можете использовать его следующим образом:

std::basic_istream<uint32_helper_t> 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<uint32_t> data;
data.assign( std::istream_iterator<uint32_t, uint32_helper_t>(my_file),
  std::istream_iterator<uint32_t, uint32_helper_t>() );
1 голос
/ 04 июня 2010

Вы можете сделать:

int i;
fstr.read((int*)&i, sizeof(int));
0 голосов
/ 04 июня 2010

Вы можете попробовать это:

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<HRSIZE; ++i)
    {
        fstr.read((char *)(bhr+i), sizeof(int));
    }
    fstr.close();

    // for correctness
    return 0;
}
0 голосов
/ 04 июня 2010

Это то, что вы имеете в виду? Кстати, ваш код (и это) предполагает естественную последовательность данных.

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...