新手求指导,关于C++读取文件时的错误

http://tieba.baidu.com/p/3303230018我在Input函数中return前面加了cout<<i,发现即使电话本清空后读取到i为1,而不为0,... http://tieba.baidu.com/p/3303230018
我在Input函数中return 前面加了cout<<i,发现即使电话本清空后读取到i为1,而不为0,难道是eof()出了问题
展开
 我来答
xoaxa
推荐于2016-09-04 · TA获得超过8612个赞
知道大有可为答主
回答量:6415
采纳率:72%
帮助的人:3510万
展开全部
#include<fstream>
#include<iostream> 
#include<stdlib.h>
#include<string> 

#include<iomanip>
using namespace std;

class Phone {
private:
string name; //用户的姓名,号码为私有属参数 
string number;
public:
Phone(){name = "noname";number = "000000";} //构造函数初始化
string Getname(){ return name; }
string Getnumber(){ return number; }
void Setname(string nm) { name = nm;} //参数赋值
void Setnumber(string num) { number = num;} //参数赋值
};

int Input(Phone ptr[]) { //用于读取已有文件
int n = 0;
string na,nu; //n为姓名串,n1为号码串
//打开电话本,没有则创建
ifstream fin("电话本.txt");
if(!fin) {
cout << "打开文件失败." << endl;
system("pause");
}
while(getline(fin,na)) {
getline(fin,nu); //用getline读取fin流中的整行文本 ,存取到字符串中 ,姓名和号码间隔存入
ptr[n].Setname(na);
ptr[n].Setnumber(nu);
n++;
}
return n;


void Output1(Phone ptr[],int length) { 
fstream out("电话本.txt"); //fout 将输入的name,number数据写入文件
for(int i = 0;i < length;i++) {
out << ptr[i].Getname() << "  ";
out << ptr[i].Getnumber() << endl;

}

void Output2(Phone ptr[],int length) { //将存入过程显示在操作界面
for(int i = 0;i < length;i++) {
cout << ptr[i].Getname() << "  ";
cout << ptr[i].Getnumber() << endl;
}
}

int SearchPhone(string name,Phone ptr[],int length) {
for(int i = 0;i < length;i++) {
if(name == ptr[i].Getname()) // 顺序寻找符合name的姓名,找到则指向该类的指针,否则返回空指针
return i;
}
return -1;



void AddPhone(string name,Phone *ptr,int n) { //添加联系人及号码
string num;
ptr[n].Setname(name);
cout << "请输入该联系人的电话:" << endl;
cin >> num;
ptr[n].Setnumber(num);
// ++length;
cout << "该联系人已添加." << endl;
}

void DeletePhone(string name,Phone ptr[],int length) { //删除 联系人及号码
int i,j;
i = SearchPhone(name,ptr,length);
if(i == -1) cout << "联系人不存在!" << endl;
else {
for(j = i;j < length - 1;j++) //查找
ptr[j] = ptr[j + 1];
cout << "该联系人已删除" << endl;
}
}

int main() {
int length = 0,choice,i; //length代表名单个数
Phone ptr[100];
string xxx;
cout << " 欢迎使用电话本\n";
cout << "读取电话本?\n 1.yes 2.no:\n" ;
cin >> choice;
if(choice == 1) {
length = Input(ptr);
cout << "文件读取成功!\n";
}
do {
cout << "请输入操作:\n";
cout << "1.添加联系人。2.删除联系人。\n";
cout << "3.查找联系人。4.文件输出。\n";
cout << "5.屏幕显示。6.结束。\n\n";
cin >> choice;
switch(choice) {
case 1: cout << "请输入添加的联系人的姓名:";
cin >> xxx;
AddPhone(xxx,ptr,length);
length++;
break;
case 2:cout << "请输入删除的联系人的姓名:";
cin >> xxx;
DeletePhone(xxx,ptr,length);
length--;
break;
case 3:cout << "请输入查找的联系人的姓名:";
cin >> xxx;
i = SearchPhone(xxx,ptr,length);
if(i == -1) cout << "此联系人不存在,请核实重试" << endl;
else cout << "该联系人的号码是:" << ptr[i].Getnumber() << endl;
break;
case 4:Output1(ptr,length);
cout << "文件已输出." << endl;break;
case 5:Output2(ptr,length);break;
case 6:break;
default:cout << "***** 输入错误。\n";break;
}
}while(choice != 6);
cout<<"欢迎再来。Goodbye!"<<endl;
fstream close(); //结束后关闭文件
system("pause");
return 0;
}
追问
可以说一下我那个问题出在哪儿吗
追答
在读文件循环中,首先判断是否到文件尾部,然后再进行读入,貌似合理,但仔细想想,当读完最后一个数据后,读数据指针指向最后一个字符的后面,此时如若再进行读入,必然后返回EOF,但此时并没有读操作,所以feof()函数不会返回“真”,而是返回“假”,则继续读入数据,两个读语句读回的数据是未知的(这就是多出的部分),此后再进行feof()判断时,其返回“真”,此时才会结束读入过程。
我回来了调用
2014-09-20 · TA获得超过388个赞
知道小有建树答主
回答量:772
采纳率:0%
帮助的人:473万
展开全部
在Input(Phone ptr[])中, 只要目标文件存在, 也会返回1, 造成当你按3, 查询联系人时, i为1, 不为0, 如果你不按3, 而是6, i应该为0.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2014-09-19
展开全部
贴代码。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友0c51129
2014-09-19
知道答主
回答量:19
采纳率:0%
帮助的人:9万
展开全部
程序贴出来看一下?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式