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变成死循环,不知道对不对??
怎么解决这个问题? 展开
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变成死循环,不知道对不对??
怎么解决这个问题? 展开
6个回答
展开全部
读和写的变量类型要一致。
用 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;
}
用 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();
写二进制文件
写二进制文件应该使用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();
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
EOF是关闭文件之后自动产生的,它不并是由人工写 的。
所以不是这原因
所以不是这原因
追问
我在关闭文件上写对了吗?
那可能是什么问题??
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
开打方式的问题吧
ab+才对吧
估计是打开的时候,直接以新建文件方式打开,读的是一个空文件
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) ;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你把addsize这个表示大小的变量 的地址 传给了 fwrite函数的第一个参数 缓冲区地址 你确定这样没问题??
更多追问追答
追问
那这句话是没有问题的fread(&b,2,1,fp); 也用的&啊?你认为fwrite怎么用呢?
追答
addsize输入的是个大小,类型是个数!!缓冲区的类型是char*啊,那是一个字符指针。
人家本来想读字符串,你给人家一个数的地址 类型就完全不同 还不出错?
能不能说下你具体想做什么,是想把输入的addsize数 输出到文件里?那不能用这种方法的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询