C、C++读写二进制文件

FILE*fp;fp=fopen("GTBL.dat","rb");while(!feof(fp)){……fread(&b,2,1,fp);……fclose(fp);}读... FILE * fp;

fp=fopen("GTBL.dat","rb");
while(!feof(fp) )
{
……
fread(&b,2,1,fp);
……
fclose(fp);
}
读文件用的是以上代码,没有问题
FILE * fp2;
fp2=fopen("GTBL.dat","ab");
short addsize=0;
cout<<"大小:";
cin>>addsize;
fwrite((char *)(&addsize), 2,1,fp2);
fclose(fp2);
写数据用的是上面的代码,文件里有数据,第一遍读没有问题,写一次后再读,直接关闭界面了,我怀疑是写数据时把EOF弄没了导致读文件的while变成死循环,不知道对不对??
怎么解决这个问题?
展开
 我来答
金色潜鸟
推荐于2016-05-22 · TA获得超过3.2万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:5581万
展开全部
读和写的变量类型要一致。
用 char 写的 用 short int 读,要使读出的内容有意义,要注意码的转换,小端码别忘了 字节次序 的交换。
feof(fp) 的判断,应当在读语句执行后判断,而不是在读以前判断。又读又写时,若判断时机不对,会带来问题。
注意读写位置。
你的程序没大问题。写全如下:
#include <iostream>
#include <ostream>
#include <fstream>
#include<stdio.h>
using namespace std;
main()
{

short b=1; // 同一类型
FILE *fp;
FILE *fp2;
int i;
for (i=0;i<3;i++)
{
fp2=fopen("GTBL.dat","ab");
short addsize=0;
cout<<"size";
cin >> addsize;
fwrite((char *)(&addsize), 2,1,fp2);
fclose(fp2);
}

fp=fopen("GTBL.dat","rb");
while(1)
{
fread(&b,sizeof(short),1,fp);
if (feof(fp)) break; // 读后判断EOF
printf("b=%d\n",b);
}
fclose(fp);
return 0;
}
更多追问追答
追问
我现在是想知道,写文件是怎么回事,我从屏幕上输入的数字怎么进到二进制文件里的?
追答
屏幕上 输入的数字 是从键盘上输入的,进 键盘输入缓冲区,
cin >> addsize; 输入语句从 键盘输入缓冲区 取数,存如 变量 addsize
输出语句 fwrite() 把 数据按2进制格式 写到 输出流缓冲区,
由于 fp2=fopen("GTBL.dat","ab"); 语句 以建好 输出流的目的地 磁盘文件 GTBL.dat,
于是 数据 经 输出流缓冲区 流入 磁盘文件。
匿名用户
推荐于2016-01-16
展开全部
  #include <fstream>
  写二进制文件

  写二进制文件应该使用ofstream类,文件的打开模式一定要是 binary,如果传入的不是 binary, 文件将以ASCII方式打开。
  下面是示例代码,用于写入文件。
  std::ofstream fout("a.dat", std::ios::binary);
  int nNum = 20;
  std::string str("Hello, world");
  fout.write((char*)&nNum, sizeof(int));
  fout.write(str.c_str(), sizeof(char) * (str.size()));
  fout.close();
  而写文本文件则比较简单,如下:
  std::ofstream fout("b.dat");
  int nNum = 20;
  std::string str("Hello, world");
  fout << nNum << "," << str << std::endl;
  fout.close();
  读二进制文件
  读取二进制文件可以使用ifstream 类来进行,文件的打开模式一定要是 binary,如果传入的不是 binary, 文件将以ASCII方式打开。
  下面是示例代码:

  std::ifstream fin("a.dat", std::ios::binary);
  int nNum;
  char szBuf[256] = {0};
  fin.read((char*)&nNum, sizeof(int));
  fin.read(szBuf, sizeof(char) * 256);
  std::cout << "int = " << nNum << std::endl;
  std::cout << "str = " << szBuf << std::endl;
  fin.close();
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友8e65fcc
2013-08-08 · 超过23用户采纳过TA的回答
知道答主
回答量:64
采纳率:0%
帮助的人:57.7万
展开全部
EOF是关闭文件之后自动产生的,它不并是由人工写 的。
所以不是这原因
追问
我在关闭文件上写对了吗?
那可能是什么问题??
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友24acf96
2013-08-08
知道答主
回答量:17
采纳率:0%
帮助的人:9.3万
展开全部
开打方式的问题吧
ab+才对吧
估计是打开的时候,直接以新建文件方式打开,读的是一个空文件
追问
不是这个问题,都不行,每次写过之后就读不出数据,直接关闭界面了,要把原来的GTBL.dat覆盖写过之后的才行,所以我怀疑是写数据的时候破坏了.dat文件,但文件的大小基本不变
追答
1检查写入文件是不是正确的 
2fwrite(char*p ,1 ,1 ,FILE*fp) 换成1试试
3读文件的时候也按1读出

最后fread写错了 它和frwite 的格式是一样的 第一参数要用内存来接收
char* p = new char[1024] ;
fread(p ,1 ,1 ,pf) ;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
掌中萌鼠
2013-08-08 · TA获得超过175个赞
知道答主
回答量:110
采纳率:0%
帮助的人:89.3万
展开全部
你把addsize这个表示大小的变量 的地址 传给了 fwrite函数的第一个参数 缓冲区地址 你确定这样没问题??
更多追问追答
追问
那这句话是没有问题的fread(&b,2,1,fp);   也用的&啊?你认为fwrite怎么用呢?
追答
addsize输入的是个大小,类型是个数!!缓冲区的类型是char*啊,那是一个字符指针。

人家本来想读字符串,你给人家一个数的地址 类型就完全不同 还不出错?
能不能说下你具体想做什么,是想把输入的addsize数 输出到文件里?那不能用这种方法的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式