在文件内搜索无法正常工作

时间:2013-09-09 14:55:22

标签: c++ file

/ *在这个程序中我的搜索文件功能有问题。它是一个函数,它将检查与fstream相关的文件是否传递滚动否。已存在于文件中或不存在。不幸的是,它无限循环。那么这个问题的原因和解决方案是什么* /

注意:搜索文件正在搜索的文件包含如下内容: -

234 | 45 | -1 | -1 | -1 | -1 |

325 | 56 | -1 | -1 | -1 | -1 |

所以每行文件中有19个字符。我们将读取卷号。例如.344然后我们必须跳过19-4 = 15个字符来读下一个卷号。所以我们必须要去16个字符。

#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
struct student{
    char roll[4];
    char name[30];
    char branch[20];
};
struct course{
    char cid[3];
    char name[10];
    char credits[2];
};

//buffer class to pack student struct details
class buffer_s{
    public:
    char buf[200];
    void pack(student &s);
};

void buffer_s::pack(student &s){
    buf[0]='\0';
    strcat(buf,s.roll);
    strcat(buf,"|");
    strcat(buf,s.name);
    strcat(buf,"|");
    strcat(buf,s.branch);
    strcat(buf,"#");    
}
//buffer class to pack course struct details
class buffer_c{
    public:
    char bufc[200];
    void pack(course &c);
};

void buffer_c::pack(course &c){
    bufc[0]='\0';
    strcpy(bufc,c.cid);
    strcat(bufc,"|");
    strcat(bufc,c.name);
    strcat(bufc,"|");
    strcat(bufc,c.credits);
    strcat(bufc,"#");   
}
//operator overloading for getting input of student struct
istream &operator >> (istream &in,student &s){
    cout<<"enter roll no. :";
    in.getline(s.roll,4);
    cout<<"enter name : ";
    in.getline(s.name,30);
    cout<<"enter branch : ";
    in.getline(s.branch,20);
    return in;
}
//operator overloading for getting input of course struct
istream &operator >> (istream &in,course &c){
    cout<<"enter course id no: ";
    in.getline(c.cid,3);
    cout<<"enter course name : ";
    in.getline(c.name,10);
    cout<<"enter credit ";
    in.getline(c.credits,2);
    return in;
}
//for searching whether the passed "roll" is already present in the file or not
int searchfile(fstream &fin,char roll[]){
    fin.clear();
    fin.seekg(0,ios::beg);


    char word[4];

    int f=0;
    if(fin.good())
    {
    fin.getline(word,3,'|');

    word[3]='\0';
    while(!fin.eof()){

        cout<<"test"<<endl;//for testing the infinite condition of loop

        if(!strcmp(roll,word))
        {f=1;break;}


        else{
        fin.seekg(16,ios::cur);//16 since total characters in a line of file 3 is 20.4 already read so 20-4=16.
        fin.getline(word,4,'|');    
        word[3]='\0';
        }

        }
    }
        fin.clear();

    if(f==1)
    return 1;


    else
    return 0;   


}

//for putting things into r_detail file
void fillreg(fstream &file3,student &s,course &c){
    file3<<s.roll;
    file3<<'|';
    file3<<c.cid;
    file3<<'|';
    file3<<-1;
    file3<<'|';
    file3<<-1;
    file3<<'|';
    file3<<-1;
    file3<<'|';
    file3<<-1;
    file3<<'|';
    file3<<endl;    
}

int main(){
    buffer_s s;
    buffer_c c;


    student ss;
    course cs;


    fstream file1;
    fstream file2;
    fstream file3;


    file1.open("s_detail.dat");
    file2.open("c_detail.dat");
    file3.open("r_detail.dat");

    int k=0;

    //k=2 for taking 2 inputs only.

    while(k<2){
    file3.clear();
    file3.seekg(0,ios::beg);
    cout<<"enter student details: "<<endl;
    cin>>ss;
    cout<<"enter course details: "<<endl;
    cin>>cs;
    cout<<endl;


    int x=searchfile(file3,ss.roll);
    cout<<x<<endl;

    if(!x)
    {
    s.pack(ss);
    file1.clear();
    file1.seekp(0,ios::end);
    file1<<s.buf;
    file1<<endl;
    }

    c.pack(cs);
    file2.clear();
    file2.seekp(0,ios::end);
    file2<<c.bufc;
    file2<<endl;

    file3.clear();
    file3.seekp(0,ios::end);

    fillreg(file3,ss,cs);
    k++;
    }
    return 0;   
}

2 个答案:

答案 0 :(得分:0)

如果main返回k<2k时{p> searchfile()次循环,0为增量如果程序处于无限循环中,则searchfile()无法在足够的调用中返回0

答案 1 :(得分:0)

这个代码和这个问题有很多问题。

您的解决方案无法正常工作的原因是您已经编写了大量代码而未对其进行任何测试。看看这个:

fin.getline(word,3,'|');

你知道这对word有什么意义吗?你期待234,对吧?你检查过了吗?即使你在此之后编写的所有代码都是完美无缺的(它不是这样),但由于这个bug,它可能对你没有任何好处。在两种情况下(数字是否存在或者不是),您是否检查了while循环以验证其是否正确终止?

解决方案是隔离你正在处理的代码部分(比如这个函数),从小而简单的东西开始,即使它没有做很多事情也能让它完美地工作,然后一次添加一点复杂性,在每一步测试,永远不会添加到不起作用的代码。

这种方法的一个不错的副作用是,如果出现错误并且你无法看到它,至少你知道它在几行内的位置,并且你可以发布一个非常短的,自足的我们看一下的例子。

此外,通过学习C ++工具,您可以省去很多麻烦:

int word;
fin >> word;