Чтение и запись 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.