我有一个充满整数的大文件,我正在加载。我刚刚开始使用C ++,我正在尝试文件流的东西。从我读过的所有内容看来,我只能读取字节数,因此我必须设置一个char数组,然后将其转换为int指针。
有没有一种方法可以一次读取4个字节,并且不需要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;
}
答案 0 :(得分:16)
要读取单个整数,请将整数的地址传递给read函数,并确保只读取sizeof int
个字节。
int myint;
//...
fstr.read(reinterpret_cast<char*>(&myint), sizeof(int));
您可能还需要以二进制模式打开文件
fstr.open("table.dat", std::ios::binary);
答案 1 :(得分:4)
要从ifstream
读取4个字节,您可以按如下方式重载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 {}
答案 2 :(得分:1)
你可以这样做:
int i;
fstr.read((int*)&i, sizeof(int));
答案 3 :(得分:0)
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();
}
答案 4 :(得分:0)
你可以试试这个:
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;
}