关于文件流的迷惑~

mfamous 2004-07-10 06:03:16
下面我写了一个将字符和整形数全部输出到文件,然后读进文件的例子,其中可以注释掉写文件操作,来进行读操作,也可以注释掉读文件操作进行写文件,我这里把写文件给注释掉了,我这代码有个问题:

(*)1.为什么我把new出来的空间delete掉,在运行时会出现问题.(看完整代码)
(*)2.还有我写文件时,由于我写的字符串可能读的时候我并不清楚有多少个,那我必须用回车行进行分割,这样的话才不致于读到其他变量的内容,比如一下就会出现读到其他内容的错误:
input.read(name,sizeof(char)*strlen(name));
input.read(memo,sizeof(char)*strlen(memo));
input.read(addr,sizeof(char)*strlen(addr));
input.read((char*)&age,sizeof(int));
我读到memo时可能会读到name的内容或者addr的内容,我觉得这种解决的办法唯有写的时候就
output.write(name,sizeof(char)*strlen(name));
output<<endl;
output.write(memo,sizeof(char)*strlen(memo));
output<<endl;
output.write(addr,sizeof(char)*strlen(addr));
output<<endl;
output.write((char*)&age,sizeof(int));
output<<endl;
然后读的时候,这样行读
input.getline(name,sizeof(char)*strlen(name));
input.getline(memo,sizeof(char)*strlen(memo));
input.getline(addr,sizeof(char)*strlen(addr));
input.getline((char*)&age,sizeof(int));
不知贵兄才是否有好的方法可以解决如上问题;

//完整代码:
#include <fstream.h>
#include <string.h>
//#include
//using namespace std;
int main()
{
//write
/*
int age=0;
char*name;
char*memo;
char*addr;
name=new char[10];
memo=new char[100];
addr=new char[100];

memset(name,' ',strlen(name));
memset(memo,' ',strlen(memo));
memset(addr,' ',strlen(addr));
ofstream output("test.db");

strcpy(name,"huangzh");
strcpy(memo,"i am a programmer");
strcpy(addr,"shanghai");
age=22;
output.write(name,sizeof(char)*strlen(name));
output<<endl;
output.write(memo,sizeof(char)*strlen(memo));
output<<endl;
output.write(addr,sizeof(char)*strlen(addr));
output<<endl;
output.write((char*)&age,sizeof(int));
output<<endl;


output.flush();
output.close();
// why error?
//delete[] name;
/// delete[] memo;
// delete[] addr;
*/
//read
int age=0;
char*name;
char*memo;
char*addr;
name=new char[10];
memo=new char[100];
addr=new char[100];
memset(name,' ',strlen(name));
memset(memo,' ',strlen(memo));
memset(addr,' ',strlen(addr));
ifstream input("test.db");

input.getline(name,sizeof(char)*strlen(name));
input.getline(memo,sizeof(char)*strlen(memo));
input.getline(addr,sizeof(char)*strlen(addr));
input.getline((char*)&age,sizeof(int));

cout<<name<<endl;
cout<<memo<<endl;
cout<<addr<<endl;
cout<<age<<endl;

//why error?
delete[] name;
delete[] memo;
delete[] addr;
input.close();


}

...全文
128 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
mfamous 2004-07-10
  • 打赏
  • 举报
回复
还有如果我根据换行进行读取,那为什么我第二次读取就会出现问题呢?在读取第二个addr时出现错误的值,第二次读取的age也会读错?
//完整源文件
#include <fstream.h>
#include <string.h>
//#include
//using namespace std;
int main()
{
//write
/*
int age=0;
char*name;
char*memo;
char*addr;
name=new char[10];
memo=new char[100];
addr=new char[100];

memset(name,' ',strlen(name));
memset(memo,' ',strlen(memo));
memset(addr,' ',strlen(addr));
ofstream output("test.db");

strcpy(name,"huangzh");
strcpy(memo,"i am a programmer");
strcpy(addr,"shanghai");
age=22;
output.write(name,sizeof(char)*strlen(name));
output<<endl;
output.write(memo,sizeof(char)*strlen(memo));
output<<endl;
output.write(addr,sizeof(char)*strlen(addr));
output<<endl;
output.write((char*)&age,sizeof(int));
output<<endl;
output.flush();

//write second
memset(name,' ',strlen(name));
memset(memo,' ',strlen(memo));
memset(addr,' ',strlen(addr));

strcpy(name,"zhoutian");
strcpy(memo,"i am a girl");
strcpy(addr,"shanghai");
age=22;
output.write(name,sizeof(char)*strlen(name));
output<<endl;
output.write(memo,sizeof(char)*strlen(memo));
output<<endl;
output.write(addr,sizeof(char)*strlen(addr));
output<<endl;
output.write((char*)&age,sizeof(int));
output<<endl;
output.flush();
output.close();
// why error?
//delete[] name;
/// delete[] memo;
// delete[] addr;
*/
//read

int age=0;
char*name;
char*memo;
char*addr;
name=new char[10];
memo=new char[100];
addr=new char[100];
ifstream input("test.db");
for(int i=0;i<2;i++)
{
memset(name,' ',strlen(name));
memset(memo,' ',strlen(memo));
memset(addr,' ',strlen(addr));

input.getline(name,sizeof(char)*strlen(name));
input.getline(memo,sizeof(char)*strlen(memo));
input.getline(addr,sizeof(char)*strlen(addr));
input.getline((char*)&age,sizeof(int));

cout<<name<<endl;
cout<<memo<<endl;
cout<<addr<<endl;
cout<<age<<endl;
//read second
}


//why error?
//delete[] name;
// delete[] memo;
// delete[] addr;
input.close();


}

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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