读书人

一个有关fstream导致的异常request fo

发布时间: 2013-06-25 23:45:42 作者: rapoo

一个有关fstream导致的错误request for member 'eof',新手求解


#include <iostream>
#include <cstring>
#include <fstream>
#include <windows.h>
using namespace std;
struct communicate{
static int num;
char xvehao[11];
char name[12];
char sex[5];
char birthday[9];
char youbian[8];
char dizhi[50];
char qqnum[12];
char tel[12];
};
struct lnode{
communicate data;
lnode*next;
};
typedef lnode*linklist;
static int b=0;
void input(communicate*a);
void visit(communicate*a);
int finput(communicate*a);
void fwrite(communicate*a);
void creat(linklist*l,int n,void(*input)(communicate*));
void fcreat(linklist*l,int(*finput)(communicate*));
void destroy(linklist*l);
void travel(linklist l,void(*visit)(communicate*));
void ftrav(linklist l,void(*fwrite)(communicate*));
void search(linklist l,char a[],void(*visit)(communicate*));
void add(linklist*l,void(*input)(communicate*));
void deleteL(linklist*l,char a[]);
ifstream inf();
ofstream outf();
int main(){
int n;
linklist*l;
while (1){
cout<<"亲,欢迎使用通讯录,下面进行功能选择:"<<endl;
cout<<"1.从文件打开通讯录 2.新建一个通讯录 3.添加一条记录"<<endl;
cout<<"4.我要找个人 5.找个人,删掉...嘻嘻 6.全打出来看一下"<<endl;
cout<<"7.我要保存 8.太挤了,清屏!! 9.果断退出"<<endl;
cin>>n;
switch(n){
case 1:{
char a[40];
cout<<"请输入文件路径(如:C:/F.csv):"<<endl;
cin>>a;
ifstream inf(a,ios_base::in|ios_base::out);
inf.getline(a,sizeof(a)-1);
fcreat(l,*finput);
inf.close();
}break;
case 2:{
int s;
cout<<"请问你想要建几条记录呢?"<<endl;
cin>>s;
cout<<"开始输数据了,亲(请依次输入:学号、性别、生日、邮编、地址、QQ、电话,空格间隔)"<<endl;
creat(l,s,*input);


}break;
case 3:{
cout<<"开始输数据了,亲(请依次输入:学号、性别、生日、邮编、地址、QQ、电话,空格间隔)"<<endl;
add(l,*input);break;
}break;
case 4:{
cout<<"请输入需要查找的人的编号、学号、或者姓名:"<<endl;
char a[20];
cin>>a;
search(*l,a,*visit);
}break;
case 5:{
cout<<"请输入需要删除的人的编号、学号、或者姓名:"<<endl;
char a[20];
cin>>a;
deleteL(l,a);
cout<<"OK"<<endl;
}break;
case 6:travel(*l,*visit);break;
case 7:{
char a[40];
cout<<"请输入文件路径(如:C:/F.csv):"<<endl;
cin>>a;
ofstream outf(a,ios_base::in|ios_base::out);
ftrav(*l,fwrite);
outf.close();
}break;
case 8:system("cls");break;
case 9:break;
}
if(n==9)break;
}
}
void input(communicate*a){
cin>>a->xvehao>>a->name>>a->sex>>a->birthday>>a->youbian>>a->dizhi>>a->qqnum>>a->tel;
a->num=b;
b++;
}
void visit(communicate*a){
cout<<a->num<<" "<<a->xvehao<<" "<<a->name<<" "<<a->sex<<" "<<a->birthday<<" "<<a->youbian<<" "<<a->dizhi<<" "<<a->qqnum<<" "<<a->tel<<endl;
}
int finput(communicate*a){
char A[500],b[8][50];
int n,i=0,j=0,t;

if(!inf.eof()){
inf.getline(A,sizeof(A)-1);


for(i=0;A[i]!='\0';i++){
if(A[i]==','){j++;b[j][t]=='\0';t=0;continue;}
b[j][t++]=A[i];
}
strcpy(a->xvehao,b[0]);
strcpy(a->name,b[1]);
strcpy(a->sex,b[2]);
strcpy(a->birthday,b[3]);
strcpy(a->youbian,b[4]);
strcpy(a->dizhi,b[5]);
strcpy(a->qqnum,b[6]);
strcpy(a->tel,b[7]);
return 0;
}
else return 1;

for(i=0;A[i]!='\0';i++){
if(A[i]==','){j++;b[j][t]=='\0';t=0;continue;}
b[j][t++]=A[i];
}
strcpy(a->xvehao,b[0]);
strcpy(a->name,b[1]);
strcpy(a->sex,b[2]);
strcpy(a->birthday,b[3]);
strcpy(a->youbian,b[4]);
strcpy(a->dizhi,b[5]);
strcpy(a->qqnum,b[6]);
strcpy(a->tel,b[7]);
return 0;
}
void fwrite(communicate*a){
outf<<a->xvehao<<","<<a->name<<","<<a->sex<<","<<a->birthday<<","<<a->youbian<<","<<a->dizhi<<","<<a->qqnum<<","<<a->tel<<endl;
}
void creat(linklist*l,int n,void(*input)(communicate*)){
linklist p,s;
p=*l=new lnode;
for(;n>0;n--){
s=new lnode;
input(&s->data);
p->next=s,p=s;
}
p->next=NULL;
}
void fcreat(linklist*l,int(*finput)(communicate*)){
linklist p,s;
p=*l=new lnode;
for(int n=10000;n>0;n--){
s=new lnode;
if(finput(&s->data)==1)break;
p->next=s,p=s;
}
p->next=NULL;
}
void destroy(linklist*l){
linklist q,p=*l;
while(p!=NULL){
q=p->next;
delete p;
q=p;
}
*l=NULL;
}
void travel(linklist l,void(*visit)(communicate*)){
linklist p=l->next;
while(p!=NULL){
visit(&(p->data));
p=p->next;
}
}
void ftrav(linklist l,void(*fwrite)(communicate*)){
linklist p=l->next;


while(p!=NULL){
fwrite(&(p->data));
p=p->next;
}
}
void search(linklist l,char a[],void(*visit)(communicate*)){
linklist p=l->next;
while(p!=NULL){
if(p->data.num==(a[0]-'0')&&a[1]=='/0')break;
if(strcmp(p->data.name,a))visit(&(p->data));
if(strcmp(p->data.xvehao,a))visit(&(p->data));
}
}
void add(linklist*l,void(*input)(communicate*)){
linklist p=*l;
while(p!=NULL){
p=p->next;
}
input(&p->data);
p->next=NULL;
}
void deleteL(linklist*l,char a[]){
linklist p=NULL,q=*l;
while(q!=NULL){
p=q;
q=q->next;
if(strcmp(q->data.name,a))break;
if(strcmp(q->data.xvehao,a))break;
if(q->data.num==(a[0]-'0')&&a[1]=='/0')break;
}
p->next=q->next;
delete q;
}


错误提醒\main.cpp|107|error: request for member 'eof' in 'inf', which is of non-class type 'std::ifstream() {aka std::basic_ifstream<char>()}'|
\main.cpp|108|error: request for member 'getline' in 'inf', which is of non-class type 'std::ifstream() {aka std::basic_ifstream<char>()}'|
\main.cpp|140|error: invalid operands of types 'std::ofstream() {aka std::basic_ofstream<char>()}' and 'char [11]' to binary 'operator<<'|
什么原因,该怎么办,求解,先谢谢大家了
[解决办法]
结构中的字符数组,赋值以后需要手工在末尾补0x00作为字符串的结束符。不要想当然的以为strcpy以后每个字符串就是期望的值。
[解决办法]

#include <iostream>
#include <cstring>
#include <fstream>
#include <windows.h>
using namespace std;



struct communicate{
static int num;
char xvehao[11];
char name[12];
char sex[5];
char birthday[9];
char youbian[8];
char dizhi[50];
char qqnum[12];
char tel[12];
};

int communicate::num = 0;



struct lnode{
communicate data;
lnode*next;
};
typedef lnode*linklist;
static int b=0;
void input(communicate*a);
void visit(communicate*a);
int finput(communicate*a);
void fwrite(communicate*a);
void creat(linklist*l,int n,void(*input)(communicate*));
void fcreat(linklist*l,int(*finput)(communicate*));
void destroy(linklist*l);
void travel(linklist l,void(*visit)(communicate*));
void ftrav(linklist l,void(*fwrite)(communicate*));
void search(linklist l,char a[],void(*visit)(communicate*));
void add(linklist*l,void(*input)(communicate*));
void deleteL(linklist*l,char a[]);
ifstream inf("123.txt");
ofstream outf("456.txt");
int main(){
int n;
linklist*l;
while (1){
cout<<"亲,欢迎使用通讯录,下面进行功能选择:"<<endl;
cout<<"1.从文件打开通讯录 2.新建一个通讯录 3.添加一条记录"<<endl;
cout<<"4.我要找个人 5.找个人,删掉...嘻嘻 6.全打出来看一下"<<endl;
cout<<"7.我要保存 8.太挤了,清屏!! 9.果断退出"<<endl;
cin>>n;
switch(n){
case 1:{
char a[40];
cout<<"请输入文件路径(如:C:/F.csv):"<<endl;
cin>>a;
ifstream inf(a,ios_base::in
[解决办法]
ios_base::out);
inf.getline(a,sizeof(a)-1);
fcreat(l,*finput);
inf.close();
}break;
case 2:{
int s;
cout<<"请问你想要建几条记录呢?"<<endl;
cin>>s;
cout<<"开始输数据了,亲(请依次输入:学号、性别、生日、邮编、地址、QQ、电话,空格间隔)"<<endl;
creat(l,s,*input);
}break;
case 3:{
cout<<"开始输数据了,亲(请依次输入:学号、性别、生日、邮编、地址、QQ、电话,空格间隔)"<<endl;
add(l,*input);break;
}break;
case 4:{
cout<<"请输入需要查找的人的编号、学号、或者姓名:"<<endl;


char a[20];
cin>>a;
search(*l,a,*visit);
}break;
case 5:{
cout<<"请输入需要删除的人的编号、学号、或者姓名:"<<endl;
char a[20];
cin>>a;
deleteL(l,a);
cout<<"OK"<<endl;
}break;
case 6:travel(*l,*visit);break;
case 7:{
char a[40];
cout<<"请输入文件路径(如:C:/F.csv):"<<endl;
cin>>a;
ofstream outf(a,ios_base::in
[解决办法]
ios_base::out);
ftrav(*l,fwrite);
outf.close();
}break;
case 8:system("cls");break;
case 9:break;
}
if(n==9)break;
}
}
void input(communicate*a){
cin>>a->xvehao>>a->name>>a->sex>>a->birthday>>a->youbian>>a->dizhi>>a->qqnum>>a->tel;
a->num=b;
b++;
}
void visit(communicate*a){
cout<<a->num<<" "<<a->xvehao<<" "<<a->name<<" "<<a->sex<<" "<<a->birthday<<" "<<a->youbian<<" "<<a->dizhi<<" "<<a->qqnum<<" "<<a->tel<<endl;
}
int finput(communicate*a){
char A[500],b[8][50];
int n,i=0,j=0,t;

if(!inf.eof()){
inf.getline(A,sizeof(A)-1);
for(i=0;A[i]!='\0';i++){
if(A[i]==','){j++;b[j][t]='\0';t=0;continue;}
b[j][t++]=A[i];
}
strcpy(a->xvehao,b[0]);
strcpy(a->name,b[1]);
strcpy(a->sex,b[2]);
strcpy(a->birthday,b[3]);


strcpy(a->youbian,b[4]);
strcpy(a->dizhi,b[5]);
strcpy(a->qqnum,b[6]);
strcpy(a->tel,b[7]);
return 0;
}
else return 1;

for(i=0;A[i]!='\0';i++){
if(A[i]==','){j++;b[j][t]='\0';t=0;continue;}
b[j][t++]=A[i];
}
strcpy(a->xvehao,b[0]);
strcpy(a->name,b[1]);
strcpy(a->sex,b[2]);
strcpy(a->birthday,b[3]);
strcpy(a->youbian,b[4]);
strcpy(a->dizhi,b[5]);
strcpy(a->qqnum,b[6]);
strcpy(a->tel,b[7]);
return 0;
}
void fwrite(communicate*a){
outf<<a->xvehao<<","<<a->name<<","<<a->sex<<","<<a->birthday<<","<<a->youbian<<","<<a->dizhi<<","<<a->qqnum<<","<<a->tel<<endl;
}
void creat(linklist*l,int n,void(*input)(communicate*)){
linklist p,s;
p=*l=new lnode;
for(;n>0;n--){
s=new lnode;
input(&s->data);
p->next=s,p=s;
}
p->next=NULL;
}
void fcreat(linklist*l,int(*finput)(communicate*)){
linklist p,s;
p=*l=new lnode;
for(int n=10000;n>0;n--){
s=new lnode;
if(finput(&s->data)==1)break;
p->next=s,p=s;
}
p->next=NULL;
}
void destroy(linklist*l){
linklist q,p=*l;
while(p!=NULL){
q=p->next;
delete p;
q=p;
}
*l=NULL;
}
void travel(linklist l,void(*visit)(communicate*)){
linklist p=l->next;
while(p!=NULL){
visit(&(p->data));
p=p->next;
}
}
void ftrav(linklist l,void(*fwrite)(communicate*)){
linklist p=l->next;
while(p!=NULL){
fwrite(&(p->data));
p=p->next;
}
}
void search(linklist l,char a[],void(*visit)(communicate*)){
linklist p=l->next;
while(p!=NULL){
if(p->data.num==(a[0]-'0')&&a[1]=='/0')break;


if(strcmp(p->data.name,a))visit(&(p->data));
if(strcmp(p->data.xvehao,a))visit(&(p->data));
}
}
void add(linklist*l,void(*input)(communicate*)){
linklist p=*l;
while(p!=NULL){
p=p->next;
}
input(&p->data);
p->next=NULL;
}
void deleteL(linklist*l,char a[]){
linklist p=NULL,q=*l;
while(q!=NULL){
p=q;
q=q->next;
if(strcmp(q->data.name,a))break;
if(strcmp(q->data.xvehao,a))break;
if(q->data.num==(a[0]-'0')&&a[1]=='/0')break;
}
p->next=q->next;
delete q;
}



具体的功能我也不细看了,就把你明显的错误改了一下,可以运行了。还有,你 fstream 打开哪个文件呀?不管ifstream还是ofstream,你总要告诉别人,你要打开什么文件吧,怎么参数是空的。
[解决办法]
引用:
ifstream inf();
ofstream outf();
//这里被理解成了函数申明了,没有定义对象

改为:
ifstream inf;
ofstream outf


LOL

ofstream outf -> ofstream outf;

读书人网 >C++

热点推荐