首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个有关fstream导致的异常request for member 'eof'新手求解

2013-06-25 
一个有关fstream导致的错误request for member ɾof',新手求解#include iostream#include cs

一个有关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;

热点排行