Как сохранить целочисленное значение «0» в файле .bin? (C ++) - PullRequest
0 голосов
/ 27 мая 2009

EDIT: по-видимому, проблема в функции чтения: я проверил данные в шестнадцатеричном редакторе

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 дважды читает последнее значение.

Ответы [ 4 ]

2 голосов
/ 27 мая 2009

int num = 0;
write( fd, &num, sizeof( int ));
1 голос
/ 27 мая 2009

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

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
1 голос
/ 27 мая 2009

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

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

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

0 голосов
/ 27 мая 2009

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

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

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

...