2013-09-08 4 views
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; 
} 

ответ

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. При использовании нетривиального преобразования может потребоваться записать конец последовательности сдвига в режиме записи. Это не должно быть вызвано неявной операцией, то есть пользователю лучше знать (конечно, я сомневаюсь, что многие пользователи знают, что операция поиска может записать конец последовательности смены).

В любом случае: поиск подходящего места, где вы действительно хотите написать свои данные, должно устранить проблему.

+0

, даже если я добавляю seek_key (fout, v); после fout >> test; для перемещения seekp он будет равен -1 и не будет идти в соответствии с моей функцией seek_key.Что происходит сейчас? –

+0

@ user2718205: было прочитано успешно (вы должны убедиться, что все операции чтения в любом случае успешны)? В противном случае поток перешел в режим сбоя (отклоненный от диаграммы состояния ...), в этот момент он ничего не сделает, пока не появится сообщение об ошибке «clear()». –

+0

теперь он работает хорошо после выполнения clear(). Благодарю. –