0

在这个程序中,我想转到文件中的特定位置并在那里读取。

如果那里有空间,我将在那里写我的缓冲区,否则我想搜索下一个“空白空间”。现在问题在于我在评论中写的那些行put 2 lines under comment from here。如果我包含这些行,我的输出文件是空白的。如果我删除这 2 行,它会在文件中正确写入。但我想在写作之前阅读。

通过这两行代码,我可以阅读。所以你能建议我任何替代的阅读方式,以便缓冲区文件在阅读后进入输出文件而不是保持空白。

或者我在这里做错了什么?

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
//moving the seekp pointer of the fstream
void seek_key(fstream &fout,int k){
    if(k==0)
        fout.seekp(0,ios::beg);
    else{
        k=((k*2)-1)+(k*42);
        fout.seekp(k,ios::beg);
    }
}
//moving the seekg pointer of fstream
void seec_key(fstream &fout,int k){
    if(k==0)
        fout.seekg(0,ios::beg);
    else{
        k=((k*2)-1)+(k*42);
        fout.seekg(k,ios::beg);
    }
}
//to put n spaces in the file so that later i can put record in that location
//actually doing hashing files
void make_file(fstream &fout,int n){
    int i;
    i=n;
    i--;
    while(i>0){
        for(int j=0;j<42;j++)
        fout<<" ";
        fout<<"\n";
        i--;
    }   
}

struct student{
    string roll;
    string name;
    string cgpa;
};
class buffer{
    public:
    string buf;
    void pack(student s);
    void unpack(istream fin,student s);
};
void buffer::pack(student s){
    buf=s.roll;
    buf=buf+"|";
    buf=buf+s.name;
    buf=buf+"|";
    buf=buf+s.cgpa;
    buf=buf+"|";
}
//cin overloading to get input into student structure
istream &operator >> (istream &in,student &s){
    cout<<"enter student name: ";
    in>>s.name;
    cout<<"enter student roll: ";
    in>>s.roll;
    cout<<"enter cpga: ";
    in>>s.cgpa;
}
//for adding student buffer into the file
void add(fstream &fout,buffer &b,student &s,int k){

    int key=atoi(s.roll.c_str());
    int v=key%k;

    char test;
    seek_key(fout,v);
    seec_key(fout,v);
    // put 2 lines under comments from here 
    fout>>test;
    cout<<"this is test."<<test<<".test"<<endl;
    fout<<b.buf;

}
int main(){
    student s;
    buffer b;
    fstream fout;
    fout.open("hash.txt");
    int n;
    cout<<"enter the no. of records: ";
    cin>>n;
    make_file(fout,n);
    char ans;
    do{
        cin>>s;
        b.pack(s);

        add(fout,b,s,n);

        cout<<"to enter more students press y else n";
        cin>>ans;
    }while(ans=='y'||ans=='Y');
    fout.close();
    return 0;
}
4

1 回答 1

0

基本上,你有这个代码:

fout>>test;     // line 1
                // code not using fout removed
fout<<b.buf;    // line 2

基本上,这意味着您在不干预搜索的情况下进行读写:这是未定义的行为!文件流的状态可以用状态机来描述:

initial -> unbound
unbound + write    -> write mode
write mode + write -> write mode
write mode + seek  -> unbound
write mode + read  -> undefined behavior
unbound + read     -> read mode
read mode + read   -> read mode
read mode + seek   -> unbound
read mode + write  -> undefined behavior

以写入模式读取或以读取模式写入是未定义行为的原因有几个:

  1. 性能:需要适当地设置内部缓冲区,这是一项重要的操作,并且检查是否正确会不必要地减慢操作速度。
  2. 用户期望的适当流位置完全不清楚。最好让用户澄清期望。
  3. 当使用非平凡转换时,可能需要在写入模式下写入移位序列的结尾。这不应该由隐式操作触发,即用户应该更好地意识到(当然,我怀疑许多用户是否知道查找操作可能会写入移位序列的结尾)。

无论如何:寻找您真正想要写入数据的适当位置应该可以解决问题。

于 2013-09-08T22:01:49.037 回答