Чтение 64-битного целочисленного файла

Я пытаюсь выучить C ++, написав собственный код и очень новый в этой области.

В настоящее время я пытаюсь прочитать и записать 64-битный целочисленный файл. Я пишу 64-битный целочисленный файл следующим образом:

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

Кто-нибудь может мне помочь, как прочитать этот 64-битный целочисленный файл (один за другим)? Итак, я нашел далеко не все примеры, которые читаются построчно, а не одно за другим.

Редактировать:

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

4

Решение

если ты должен используйте текстовый файл, вам нужно что-то выделить разделение форматированных значений. пробелы например:

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

Как говорится, я бы настоятельно советую вы используете методы iostream более низкого уровня (write(), read()) и запишите их в двоичном виде.

Пример с использованием чтения / записи и двоичных данных (есть ли 64-битный эквивалент htonl / ntohl, кстати?)

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();
2

Другие решения

Вы имеете в виду что-то вроде этого?

ifstream idt;
idt.open("example.dat");
uint64_t cur;
while( idt>>cur ) {
// process cur
}
0

По вопросам рекламы [email protected]