读取64位整数文件 我尝试通过自己编写一些代码,在这个领域中很新的学习C++。

读取64位整数文件 我尝试通过自己编写一些代码,在这个领域中很新的学习C++。,c++,file-io,uint64,C++,File Io,Uint64,目前,我正在尝试读取和写入64位整数文件。我以以下方式写入64位整数文件: ofstream odt; odt.open("example.dat"); for (uint64_t i = 0 ; i < 10000000 ; i++) odt << i ; 流odt的; odt.open(“example.dat”); 对于(uint64_t i=0;i

目前,我正在尝试读取和写入64位整数文件。我以以下方式写入64位整数文件:

ofstream odt;
odt.open("example.dat");
for (uint64_t i = 0 ; i < 10000000 ; i++)
odt << i ;
流odt的
;
odt.open(“example.dat”);
对于(uint64_t i=0;i<10000000;i++)
odt cur){

你是说像这样的事吗

ifstream idt;
idt.open("example.dat");
uint64_t cur;
while( idt>>cur ) {
  // process cur
}
如果必须使用文本文件,则需要一些东西来描述格式化值的分隔。例如,空格:

ofstream odt;
odt.open("example.dat");
for (uint64_t i = 0 ; i < 100 ; i++)
    odt << i << ' ';

odt.flush() ;

ifstream idt;
idt.open("example.dat");
uint64_t cur;
while( idt >> cur )
    cout << cur << ' ';

我以上面的代码为例。我已经添加了必要的异常处理。如果您要使用文本,请在每一次写入之间用空格分隔,否则您很快就会发现在写入时无法读回它们。您的整数将被写入文本,而不是64位块。这是写入数据时的正常行为文件使用<代码> OFFROWS 。如果你想把实际二进制二进制文件写到文件中,你就必须使用除<代码>之外的东西。你真的需要得到一本关于C++的好书并阅读它。你不能通过猜测和试验来正确地学习编程语言。@ USS18833:一本好书是你所能得到的最好的指针。我在谷歌上搜索了一个小时,想找到一种在文件(不一定是文本文件)中读写整数的好方法就像在64位块中。但是,我没有找到任何好的例子。你能说明什么方法?你能举一个小例子吗?对不起,我对C++的想法很有限。@ USE188334。如果你不熟悉C++,你现在应该跟上它,但是要读关于流对象的不同方法,特别是 OFSo::
方法和
istream::read()
方法。随着时间的推移,它会出现在您的面前。有一个比您当前的方法更简单的黑客攻击,它的速度更快。它有编译器特定的方法,对于gcc/clang,
\u内置bswap64
,对于msvc,
\u byteswap\u uint64
ofstream odt;
odt.open("example.dat");
for (uint64_t i = 0 ; i < 100 ; i++)
    odt << i << ' ';

odt.flush() ;

ifstream idt;
idt.open("example.dat");
uint64_t cur;
while( idt >> cur )
    cout << cur << ' ';
ofstream odt;
odt.open("example.dat", ios::out|ios::binary);
for (uint64_t i = 0 ; i < 100 ; i++)
{
    uint32_t hval = htonl((i >> 32) & 0xFFFFFFFF);
    uint32_t lval = htonl(i & 0xFFFFFFFF);
    odt.write((const char*)&hval, sizeof(hval));
    odt.write((const char*)&lval, sizeof(lval));
}

odt.flush();
odt.close();

ifstream idt;
idt.open("example.dat", ios::in|ios::binary);
uint64_t cur;
while( idt )
{
    uint32_t val[2] = {0};
    if (idt.read((char*)val, sizeof(val)))
    {
        cur = (uint64_t)ntohl(val[0]) << 32 | (uint64_t)ntohl(val[1]);
        cout << cur << ' ';
    }
}
idt.close();