请教:C语言关于大量大结构体数据的二进制文件读写。

scu_sundy 2010-03-01 09:42:04
结构如下:
typedef struct tagDATA
{
int m_nData1;
float m_fData2;
float m_fData3;
float m_fData4;
float m_fData5;
float m_fData6;
float m_fData7;
WORD m_wData8;
WORD m_wData9;
} TSTDATA;
typedef struct tagData2File
{
TSTDATA pTSTData
float fZ,fS;
float nZ,nS;
float fPos;
float fBlk;
bool bSign;
}DATA2FILE;

问题如下:
1. 将120个TSTDATA结构体的数组,先使用fwrite写入,再用fread读取,读出来的数据正确;
2. 但用相同的方法写入1200个TSTDATA的结构体,读取的数据约前150个结构正确,之后的错误;
3. 对于任何数量的DATA2FILE结构体数组,先使用fwrite写入,再用fread读取,读出来的数据就是错误。

有没有高人告知原因啊,谢谢!!!
...全文
407 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuzl32 2010-03-02
  • 打赏
  • 举报
回复

//测试第3点:
//对于任何数量的DATA2FILE结构体数组,先使用fwrite写入,再用fread读取,读出来的数据就是错误。
//测试结果正确!不知道LZ的错误原因具体怎么出现的?

#include <windows.h>
#include <stdio.h>

typedef struct tagDATA
{
int m_nData1;
float m_fData2;
float m_fData3;
float m_fData4;
float m_fData5;
float m_fData6;
float m_fData7;
WORD m_wData8;
WORD m_wData9;
} TSTDATA;
typedef struct tagData2File
{
TSTDATA pTSTData;
float fZ,fS;
float nZ,nS;
float fPos;
float fBlk;
bool bSign;
}DATA2FILE;

int main()
{
FILE *fp = NULL;
DATA2FILE data = {0},datatemp = {0};
data.pTSTData.m_nData1 = 5;
data.pTSTData.m_fData2 = 2.3;
data.pTSTData.m_fData3 = 3.4;
data.pTSTData.m_fData4 = 4;
data.pTSTData.m_fData5 = 5.5;
data.fZ = 0.2;
data.fS = 3;

fp = fopen("temp.dat","wb");
if(fp == NULL) return 0;
fwrite(&data,sizeof(DATA2FILE),1,fp);
fclose(fp);

fp = fopen("temp.dat","rb");
if(fp == NULL) return 0;
fread(&datatemp,sizeof(DATA2FILE),1,fp);
fclose(fp);

printf("%d,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",
data.pTSTData.m_nData1,
data.pTSTData.m_fData2,
data.pTSTData.m_fData3,
data.pTSTData.m_fData4,
data.pTSTData.m_fData5,
data.fZ,
data.fS);
}
//输出结果:5,2.30,3.40,4.00,5.50,0.20,3.00
chary8088 2010-03-02
  • 打赏
  • 举报
回复
写入没问题的,读取也没问题
打开方式错了
FILE  *wFile; 
if ((wFile = fopen(filename.c_str(), "r+b")) == NULL) /*open file */
{
fprintf(stderr, "Cannot open output file.\n");
return -1;
}


r+ Open for reading and writing. The stream is positioned at the beginning of the file.
scu_sundy 2010-03-01
  • 打赏
  • 举报
回复
这个是我在下面没写,程序里用的是rb
2010-03-01
  • 打赏
  • 举报
回复
"wb" 打开的文件不能读的……
重新用 "rb" 打开看看。
scu_sundy 2010-03-01
  • 打赏
  • 举报
回复
代码简单,就是结构体数组的IO,我想知道有人解决过这个问题没有!希望有高手解惑!
FILE *wFile;
if ((wFile = fopen(filename.c_str(), "wb")) == NULL) /*open file */
{
fprintf(stderr, "Cannot open output file.\n");
return -1;
}


//write:
const int nCount = 120;//or 1200
TSTDATA *pBuf = new TSTDATA[nCount];
//在此处对数组赋值。
int nW = fwrite(pBuf,sizeof(TSTDATA),nCount,wFile);
if(nW != nCount)
{
fprintf(stderr, "Writing incorrect.\n");
}
delete []pBuf;

//read
const int nCount = 120;//or 1200
TSTDATA *pBuf = new TSTDATA[nCount];
fread(pBuf,sizeof(TSTDATA),nCount,wFile);
//在此处调试,观察pBuf值是否正确。
delete []pBuf;

fclose(wFile);
kingstarer 2010-03-01
  • 打赏
  • 举报
回复
缓冲区的问题? 没代码不好分析
2010-03-01
  • 打赏
  • 举报
回复
无代码无真相~
回复内容太短了!
内容概要:本文深入讲解了C语言文件读写的核心技术,重点对比和解析了文本文件与二进制文件的读写方法。详细介绍了fgetc、fputc、fgets、fputs、fscanf、fprintf等用于文本文件操作的函数,以及fread和fwrite在二进制文件读写中的高效应用。通过多个实战案例,如文本文件复制、结构体数组写入二进制文件及读取修改后再写入,帮助读者掌握不同场景下的文件处理技巧。文章还系统分析了文本与二进制文件在数据存储形式、读写效率和适用场景上的差异,强化了对文件操作底层机制的理解。 适合人群:具备基本C语言基础,熟悉指针、结构体和函数等概念的初、中级开发者,尤其适合正在学习文件操作或准备从事系统级编程的程序员。 使用场景及目标:① 掌握C语言中各类文件读写函数的使用方法及其适用条件;② 理解文本与二进制文件的本质区别,能够在实际项目中根据需求选择合适的文件类型和操作方式;③ 能够实现结构化数据的持久化存储与读取,应用于配置管理、数据缓存、日志记录等场景。 阅读建议:建议结合代码实例动手实践,重点关注fread/fwrite对结构体的处理机制,注意文件打开模式(如"r" vs "rb")的区别,并在调试中观察文本与二进制文件的实际存储差异,加深对数据编码和内存布局的理解。

65,212

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧