Не могу прочитать один Int за раз из двоичного файла - PullRequest
0 голосов
/ 03 июня 2018

Я изучаю операции ввода-вывода C ++ и столкнулся с проблемами при чтении из двоичного файла.Я инициализирую массив со 100 случайными значениями и записываю значения в массиве в файл .bin.Я думаю, что эту часть я отключил - по какой-то причине мой .bin размер файла составляет 1600 байт вместо 400 - но я борюсь с чтением значений.

Я думал, что можно читать int по int, перебирая массив memblock, содержащий значения чтения, но мой вывод консоли показывает одно случайное число, за которым следует множество нулей.Буду признателен за ваше руководство.

// reading a binary file int by int 
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
using namespace std;

int main () {
    FILE * pFile; 
    streampos size;
    int * memblock;
    srand(time(NULL));
    int array[100];

    //data to write initially stored in array
    for (int i=0;i<100;i++){
        array[i]=rand()%100;
    }

    pFile = fopen("writebinary.bin","wb");
    fwrite(array,sizeof(int),sizeof(array),pFile);
    fclose(pFile);

    ifstream readFile("writebinary.bin",ios::binary | ios::ate);
    if (readFile.is_open()){
        size = readFile.tellg();
        //allocate memory to read file contents
        memblock = new int[size];
        readFile.seekg(0,ios::beg);
        for (int i=0;i<100;i++){ //100 because there are 100 ints,I'm assuming 32 bits are read a at a time from writebinary.bin
            readFile.read((char*)memblock,sizeof(int));
        }
        readFile.close();
    }
    else {
        cout << "can't open file " << endl;
    }
    for (int i=0;i<100;i++){
        cout << memblock[i] << endl;
    }
    return 0;
}

1 Ответ

0 голосов
/ 04 июня 2018

Ну, для вашей первой проблемы sizeof(array) - это 400, потому что ваш массив из 100 дюймов занимает 400 байтов, а sizeof(int) - это 4, потому что int - это 32 бита.Вот почему вы получаете 1600-байтовый выходной файл.Вы жестко кодируете число 100 повсюду;здесь вам также нужно жестко его кодировать или использовать sizeof(array)/sizeof(int).

Во-вторых, вам не нужно выполнять итерации при использовании istream :: read.Требуется размер буфера для чтения в байтах.Поэтому сделайте readFile.read((char *)memblock,sizeof(array)); только один раз.

В другой заметке, однако, ваш код представляет собой мешанину программирования в стиле C и программирования на языке C ++ iostreams.Зачем использовать fopen / fwrite / fclose?Вы должны использовать std :: ofstream и использовать функцию-член write , аналогичную вашей readFile.read.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...