Чтение и запись int в двоичный файл на C++

Мне неясно, как работает чтение длинных целых чисел. Если я говорю

long int a[1]={666666}
ofstream o("ex",ios::binary);
o.write((char*)a,sizeof(a));

хранить значения в файле и хотите прочитать их обратно, как есть

long int stor[1];
ifstream i("ex",ios::binary);
i.read((char*)stor,sizeof(stor));

как я смогу отобразить тот же номер, что хранится, используя информацию, хранящуюся в нескольких байтах массива символов?

2 ответа

o.write не записывает символ, он записывает байты (если помечено с помощью ios::binary). Указатель на символ используется, потому что длина символа составляет 1 байт.

o.write((char*)a,sizeof(a)); 

(char*) a адрес чего o.write должен написать. Потом пишет sizeof(a) байтов в файл. Там не хранятся символы, только байты.

Если вы откроете файл в Hex-редакторе, вы увидите что-то вроде этого, если int i = 10:0A 00 00 00 (4 байта, на x64).

Чтение является аналогом.

Вот рабочий пример:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;


int main (int argc, char* argv[]){
    const char* FILENAM = "a.txt";
    int toStore = 10;
    ofstream o(FILENAM,ios::binary);

    o.write((char*)&toStore,sizeof(toStore));
    o.close();

    int toRestore=0;
    ifstream i(FILENAM,ios::binary);
    i.read((char*)&toRestore,sizeof(toRestore));

    cout << toRestore << endl;


    return 0;
}

Извините, что я так долго видел ваш вопрос.

Я думаю, что разница между двоичным является то, что двоичный файл будет читать и записывать файл как есть. Но недвоичный (то есть текстовый) режим исправит конец строки \ n с возвратом каретки \ r. Исправление будет меняться вперед и назад между '\ n' и '\ r', или "\n\r" или "\r\n", или оставит его как "\ n". Что это делает, зависит от того, является ли целевая операционная система Mac, Windows, Unix и т. Д.

Я думаю, что если вы читаете и пишете целое число, оно будет хорошо читать и записывать ваше целое число и будет выглядеть правильно. Но если некоторые байты из целого числа выглядят как '\ r' и '\n', то целое число не будет правильно считывать данные из файла.

Двоичный код гарантирует, что чтение int всегда будет правильным. Но вы хотите, чтобы текстовый режим форматировал файл для чтения в текстовом редакторе, таком как Блокнот Windows.

Другие вопросы по тегам