二进制文件I/O使用file *

Binary file I/O using FILE*

本文关键字:file 使用 二进制文件      更新时间:2023-10-16

我一直在网上搜索,实现如下所示的信息,但由于我不理解的原因,我不能得到这个非常简单的代码工作。这应该是一个简单的完整性检查。我使用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*)&read_dim和简单的&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...

提前感谢大家!

我读过的链接:

  • http://www.cplusplus.com/reference/cstdio/fread/
  • http://www.cplusplus.com/forum/unices/9187/
  • https://stackoverflow.com/questions/8329767/writing-into-binary-files =
  • 用c++
  • 读取二进制文件出错
  • 如何从二进制文件中读取浮点数?
  • 读取文件's二进制
  • 用c++写二进制文件非常快
  • 读写c++矢量到文件
  • 在C
  • 中将int写入二进制文件时出现问题

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

与您对fread的验证调用相匹配,因为i_size很可能大于1 (int的典型大小为4)。

你的问题是你传递给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);

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

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

这里有两个很好的答案,我有一个评论。如果你要做大量的二进制输入/输出,那就为你的平台准备一个好的十六进制编辑器。在本例中,您可以打开创建的文件并检查数据是否正确。对于您的数据(假设您希望看到的是32位小端架构):

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

作为文件的唯一内容。您的情况可能会有所不同,但我发现查看文件的内容很有帮助(并且是更好的完整性检查)。