无法从二进制文件一次读取一个Int

时间:2018-06-03 20:58:22

标签: c++ io

我正在学习C ++ IO操作,并且在从二进制文件中读取时遇到了麻烦。我使用100个随机值初始化一个数组,并将数组中的值写入.bin文件。我认为我得到了那个部分 - 由于某种原因,虽然我的.bin文件大小是1600字节而不是400字节,但我正在努力阅读这些值。

我认为可以通过遍历包含读取值的memblock数组来读取int,但我的控制台输出显示一个随机数后跟一堆零。我很感激你的指导。

// 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 :(得分:2)

好吧,对于你的第一个问题,sizeof(array)是400,因为100个int的数组占用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