使用FILE*的二进制文件I/O

Eri*_*lan 1 c c++ binaryfiles

我一直在网上搜索,实现如图所示的信息,但由于我不明白的原因,我无法让这个非常简单的代码工作.它应该是一个简单的健全检查.我正在使用FILE*来获得速度(速度是这里的优先级).一,变量......

#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

int main()
{

//Declaration
int g = 1, dim_hi = 5, pop = 6;//variables I'll use to write to binary file
char OA = 'D';//variable I'll use to write to binary file

const short d_size = sizeof(double);
const short c_size = sizeof(char);
const short i_size = sizeof(int);
FILE * outFile;

int read_g = 0, read_dim = 0, read_pop = 0;//variables I'll use to READ from file
char read_oa ='a';//variable I'll use to READ from file
Run Code Online (Sandbox Code Playgroud)

接下来我写信给文件.据我所知(基于输出文件的大小)这段代码正常工作.我的意图是一个接一个地写三个整数和一个字符到文件...

//Binary File Output
outFile = fopen ("myfile.bin", "ab");
fwrite (&dim_hi , i_size, i_size, outFile);
fwrite (&pop , i_size, i_size, outFile);
fwrite (&g , i_size, i_size, outFile);
fwrite (&OA , c_size, c_size, outFile);
fclose (outFile);
Run Code Online (Sandbox Code Playgroud)

根据互联网,我应该有一个二进制包含值的文件:561D.但是,根据以下代码......

//Binary File Input
outFile = fopen ("myfile.bin", "rb");
fread ((void*)&read_dim , i_size, 1, outFile);
fread ((void*)&read_pop , i_size, 1, outFile);
fread ((void*)&read_g , i_size, 1, outFile);
fread (&read_oa , c_size, 1, outFile);
fclose (outFile);

return 0;
}
Run Code Online (Sandbox Code Playgroud)

注意我也尝试过(char*)和read_dim,并且只是&read_dim.我得到的是:

read_dim = 5
read_pop = -858993460
read_g = -858993460
read_oa = 9 "
Run Code Online (Sandbox Code Playgroud)

我不明白.它是一个写入列表和一个读取列表.相同的系统等等.为什么写入不对应于读取?我已经阅读了有关填充的内容,但没有一个示例使用seekg(或FILE*的等效命令)对象在文件中移动.

有什么事情知道这段代码有什么问题吗?

一旦我用这个简单的测试来解决问题,我想做一些与矩阵行相似的事情(这个矩阵最终可能包含数万个元素)......

vector<vector<double> > depop(pop, vector<double> (dim_hi,0));
short v_size = dim_hi*d_size;
for(int i = 0; i < pop; i++)
{
    fwrite (&depop[i] , d_size, v_size, outFile);
}
// followed by the read command...
Run Code Online (Sandbox Code Playgroud)

谢谢大家!

我读过的链接:

Sle*_*Eye 5

根据cplusplus.com,fwrite第三个参数是要写的元素数量,所以你应该:

fwrite (&dim_hi , i_size, 1, outFile);
fwrite (&pop , i_size, 1, outFile);
fwrite (&g , i_size, 1, outFile);
fwrite (&OA , c_size, 1, outFile);
Run Code Online (Sandbox Code Playgroud)

与您的验证呼叫匹配fread,因为i_size很可能大于1(典型大小为int4).