新手求指导,关于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()出了问题 展开
我在Input函数中return 前面加了cout<<i,发现即使电话本清空后读取到i为1,而不为0,难道是eof()出了问题 展开
展开全部
#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()判断时,其返回“真”,此时才会结束读入过程。
展开全部
在Input(Phone ptr[])中, 只要目标文件存在, 也会返回1, 造成当你按3, 查询联系人时, i为1, 不为0, 如果你不按3, 而是6, i应该为0.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-09-19
展开全部
贴代码。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
程序贴出来看一下?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询