Как сохранить целочисленное значение “0” в файле .bin?(C++)

StackOverflow https://stackoverflow.com/questions/913405

  •  06-09-2019
  •  | 
  •  

Вопрос

Редактировать:По-видимому, проблема заключается в функции чтения:Я проверил данные в шестнадцатеричном редакторе

02 00 00 00 01 00 00 00 00 00 00 00

Таким образом, ноль сохраняется как ноль, просто не считывается как ноль.

Потому что, когда я использую свою обычную функцию сохранения файла в корзине:

int a = 0;
file.write(reinterpret_cast<char*>(&a), sizeof(a));

Он хранит 0 как char версия, или "\0", которая, очевидно, не сохраняется (потому что это нулевое значение?) поэтому, когда я вызываю свою функцию для чтения нулевого значения, она считывает значение сразу после него (или прямо перед, если оно будет последним в файле).Итак, как я могу правильно сохранить ноль в файле .bin?

Редактировать:Вот некоторые функции, относящиеся к процессу чтения / записи:

//Init program: creates a sector.bin for another program to read from.
#include<fstream>
using namespace std;

int main()
{
    fstream file;
    file.open("sector.bin", ios::out | ios::binary);
    if(!file.is_open())
    {
        file.open("sector.bin", ios::out | ios::binary);
        file.close();
        file.open("sector.bin", ios::out | ios::binary);
        if(!file.is_open())
        {
            return -1;
        }
    }
    file.seekp(file.beg);
    int a = 2;
    int b = 1;
    int c = 0;
    file.write(reinterpret_cast<char*>(&a), sizeof(a));
    file.write(reinterpret_cast<char*>(&b), sizeof(b));
    file.write(reinterpret_cast<char*>(&c), sizeof(c));
    file.close();
    return 0;
}

//Read function:  part of another program that intializes variables based off
//of sector.bin
void sector::Init(std::fstream& file)
{
    int top_i = FileRead(file,0);
    std::cout<<top_i<<std::endl;
    for(int i = 0; i < top_i; i++)
    {
        accessLV[i] = FileRead(file,i+1);
        std::cout<<accessLV[i]<<std::endl;
    }
    std::cin.ignore();
    viral_data.add(new X1(5,5,'X'));
    viral_data.add(new X1(9,9,'X'));
    player.set(0,0,'O');
    return;
}
//the FileRead used in init
int FileRead(std::fstream& file, int pos)
{
    int data;
    file.seekg(file.beg + pos);
    file.read(reinterpret_cast<char*>(&data), sizeof(data));
    return data;
}

Кроме того, выходные данные для использования sector::Init заключается в следующем:

2
1
1

Вывод, который я пытался записать в корзину, был

2
1
0

Таким образом, либо 0 считывается / записывается как 1, либо он не записывается, и Init считывает последнее значение дважды.

Это было полезно?

Решение

Непонятно, что вы подразумеваете под "сохранением целочисленного значения 0" в файле.Файлы содержат байты, а не целые числа.Вам нужно сохранить sizeof(int) 0 байт или только один байт '\0'?

P.S.Я также предположил бы, что проблема может быть в вашем прочитанном коде.Вы смотрели свой файл .bin в шестнадцатеричном редакторе?

P.P.S. Ваша проблема заключается в использовании функции seekg().Вместо того чтобы передавать смещение в байтах, вы передаете pos.Вместо этого это должно быть pos * sizeof(int) .

Другие советы


int num = 0;
write( fd, &num, sizeof( int ));

Я не уверен, что вы хотите сделать, мне кажется, что предоставленный вами код делает то, о чем вы просите:

int main() {
   std::ofstream file("/tmp/tst.out");
   int a = 0;
   file.write(reinterpret_cast<char*>(&a), sizeof(a));
   return 0;
}

В результате получается файл размером в четыре байта, содержащий двоичное представление нулевого целого числа:

$ hexdump /tmp/tst.out
0000000 0000 0000
0000004

Если вы хотите сохранить целое число в виде его представления в формате ASCII, вам следует использовать форматированный потоковый вывод с <<:

std::ofstream file("/tmp/tst.out");
int a = 0;
file << a << std::endl;

Таким образом, вы получаете:

$ cat /tmp/tst.out
0

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

Предполагая (32-разрядную) машину, где sizeof (int) == 4 (и CHAR_BITS = = 8), тогда вы можете сохранить 4 байта, которые равны нулю, в текущем расположении файла, используя собственный формат, тогда, я думаю, то, что у вас там есть, должно сработать.Вы можете поэкспериментировать с другими значениями, такими как 0x01020304, вы увидите расположение байтов на вашем компьютере.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top