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

时间:2014-06-13 00:17:38

标签: 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

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

//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);

根据互联网,我应该有一个二进制包含值的文件: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;
}

注意我还试过(char *)&amp; read_dim,只是&amp; read_dim。我得到的是:

read_dim = 5
read_pop = -858993460
read_g = -858993460
read_oa = 9 "

我不明白。它是一个写入列表和一个读取列表。相同的系统等等。为什么写入不对应于读取?我已经阅读了有关填充的内容,但没有一个示例使用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...

提前谢谢大家!

链接我读过:

3 个答案:

答案 0 :(得分:5)

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

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);

与您对fread的有效通话相匹配,因为i_size很可能大于1(int的典型大小为4)。

答案 1 :(得分:2)

您的问题是您传递给fwrite的第三个参数不正确。参见:

fwrite (&dim_hi , i_size, i_size /* <-- here */, outFile);

fwrite上的人工页面说:

// The function fwrite() writes nmemb elements of data, each size bytes long...
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

这意味着您需要告诉每个元素的大小,以及您希望写入的元素数量。 从您的代码中可以清楚地知道您只想编写1个元素。所以你应该这样做:

fwrite (&dim_hi , i_size, 1 /* <-- here */, outFile);

答案 2 :(得分:1)

这里有两个很好的答案,我有一个评论。如果您打算做大量的二进制输入/输出,请为您的平台获得一个好的十六进制编辑器。在这种情况下,您可以打开您创建的文件并检查数据是否正确。使用您的数据(并假设您期望看到32位小端架构):

0x05 0x00 0x00 0x00 0x06 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x44

作为您文件的唯一内容。您的里程可能会有所不同,但我发现查看文件内容会有所帮助(以及更好的健全性检查)。