请教!!关于写文件的问题。

skyhaha 2004-11-21 01:57:05
我想问一下两种不同输入信息的做法,然后写入到文件有什么不同。

做法一:

class A
{
private:
int num;
char name[30];
public:
void getdata();
};
void A::getdata()
{
cout << "输入号码" << endl;
cin >> num;
cout << "输入姓名" << endl;
cin >> name;
//可以进行一些相关判断,确保信息的正确性
}

int main()
{
char reply = 'Y';
A object;
fstream file;
file.open("info.dat",ios::out|ios::app);
whlie (reply == 'Y' || reply == 'y')
{
object.getdata();
//调用了一个成员函数,输入的信息是在一个函数内完成。
file.write((char *)&object,sizeof(object));
cout<<"继续录入吗?(Y/N)";
cin>>reply;
}
file.close;
return 0;
}


做法二:

class A
{
private:
int num;
char name[30];
int error();
public:
void get_num();
void get_name();
};

void A::get_num()
{
char *temp = new char[8];

errorlable_num:
try
{
cout << "输入号码:(不能是字母)";
cin >> temp;
if (atoi(temp) == 0)
{
throw "号码输入错误,请重新输入。";
}else
{
num = atoi(temp);
}
catch(char *error)
{
cout << endl;
cout << "错误信息:" << error << endl << endl;
goto errorlable_NChsum;
}
}

void A::get_name()
{
int errorcode;

cout << "输入姓名:(不能超过30个字符长度)";
cin >> name;
errorcode = error(Hotel_city, "姓名超出范围,请重新输入。");
if (errorcode == 1)
{
get_name();
return;
}
return;
}

int A::error(char info[30] , char strerror[40])
{
try
{
if (strlen(info) > 30 || strlen(info) < 0)
{
throw strerror;
}
}
catch(char *error)
{
cout << endl;
cout << "错误信息:" << error << endl << endl;
return 1;
}
return 0;
}

int main()
{
char reply = 'Y';
A object;
fstream file;
file.open("info.dat",ios::out|ios::app);
whlie (reply == 'Y' || reply == 'y')
{
object.get_num();
cout >> endl;
object.get_name();
//调用了2个成员函数,信息输入在2个函数内完成
file.write((char *)&object,sizeof(object));
cout<<"继续录入吗?(Y/N)";
cin>>reply;
}
file.close;
return 0;
}

现在问题就出来了,为什么用做法一的时候往文件里面写信息就没有问题,很顺利也不出什么错误,只不过在信息的正确性上没下什么功夫,没做出错处理,用了一个函数进行信息输入。
用做法二的时候输入信息做了出错处理,为了让他可以重复输入直到正确为止,函数自己调用自己(不知道这样好不好),可是在写入文件的时候为什么写不进去呢?想不明白一个是把信息一起输入,然后写到文件,另一个是分开输入信息,再写到文件,怎么会第一个可以写进去,第二个写不进去呢?是不是做法二中,这个file.write((char *)&object,sizeof(object));有问题啊?还是整个逻辑上有问题,请告知,万分感谢!!
...全文
142 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
spider_xm 2004-11-21
  • 打赏
  • 举报
回复
有内容啊,我运行可以得,有一个问题,你name没有初始化的话,输入文件里面后有一大堆的乱码啊。
skyhaha 2004-11-21
  • 打赏
  • 举报
回复
问题有了新的发现,呵呵,我是把文件读写操作写成了一个函数,用main来调用它,当文件操作完成后,返回main,在main中加了一个“按Q退出程序”的代码exit(0);如果不退出整个程序的话,信息还是写不到文件里面,如果按q键退出的话文件里面就有信息了,不按q键,非正常退出程序的话,文件里面还是没有东西,这是为什么啊,如果每次写信息都要退出程序,那岂不是很不方便,狂郁闷。
skyhaha 2004-11-21
  • 打赏
  • 举报
回复
编译完代码后,是有这个叫info.dat的文件,也生成了,不过是0kb里面什么都没有。
我也调试了,也执行了代码的每一句话,可是文件里面就是没内容,郁闷啊。
Andy84920 2004-11-21
  • 打赏
  • 举报
回复
可是在写入文件的时候为什么写不进去呢?

//什么叫写不进去?不会产生此文件么?我的运行后输入一些信息得出此文件用文本打开如下:

{ zhao " j xP"xx" ?" j x? xiang " j xP"xx" ?" j x.0 qiu g " j xP"xx" ?" j x

最起码证明可以写入吧?
skyhaha 2004-11-21
  • 打赏
  • 举报
回复
#include <iostream>
#include <fstream>
using namespace std;

class A
{
private:
int num;
char name[30];
int name_error(char [], char []);
public:
void get_num();
void get_name();
};

void A::get_num()
{
char *temp = new char[8];

errorlable_num:
try
{
cout << "输入号码:(不能是负数、0、或字母)";
cin >> temp;
if (atoi(temp) == 0)
{
throw "标准间的个数输入错误,请重新输入。";
}else
{
num = atoi(temp);
}

if (num <= 0)
{
throw "标准间的个数输入错误,请重新输入。";
}
}
catch(char *error)
{
cout << endl;
cout << "错误信息:" << error << endl << endl;
goto errorlable_num;
}
}

void A::get_name()
{
int errorcode;

cout << "输入姓名:(不能超过30个字符长度)";
cin >> name;
errorcode = name_error(name, "城市名称超出范围,请重新输入。");
if (errorcode == 1)
{
get_name();
return;
}
return;
}

int A::name_error(char Hotinfo[30] , char strerror[40])
{
try
{
if (strlen(Hotinfo) > 30 || strlen(Hotinfo) < 0)
{
throw strerror;
}
}
catch(char *error)
{
cout << endl;
cout << "错误信息:" << error << endl << endl;
return 1;
}
return 0;
}

int main()
{
char reply = 'Y';
A object;
fstream file;
file.open("info.dat",ios::out|ios::app);
while (reply == 'Y' || reply == 'y')
{
object.get_num();
cout << endl;
object.get_name();
//调用了2个成员函数,信息输入在2个函数内完成
file.write((char *)&object,sizeof(object));
cout<<"继续录入吗?(Y/N)";
cin>>reply;
}
file.close;
return 0;
}

这个是编译通过的代码,我是Administrator的权限,不会存在文件读写的问题
anguskwan 2004-11-21
  • 打赏
  • 举报
回复
文件夹没有写权限? 会吗
umbrella1984 2004-11-21
  • 打赏
  • 举报
回复
出现什么错误?
Andy84920 2004-11-21
  • 打赏
  • 举报
回复
把你编译通过的源码帖好.
skyhaha 2004-11-21
  • 打赏
  • 举报
回复
那个goto的label我在这里写错了,编译可以通过的,就是写不到文件里面,不知道为什么。
Andy84920 2004-11-21
  • 打赏
  • 举报
回复
你的方法二编译不过,有些label没定义,我没法试.

你用goto我觉得太差了,可以改改设计.

写不进去肯定不是因为分开输入的问题.
skyhaha 2004-11-21
  • 打赏
  • 举报
回复
上面做法二中的error声明时写错了应该是
int error(char [] ,char []);

64,647

社区成员

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

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