Файлы произвольного доступа в c

#c #filestream #random-access

#c #filestream #произвольный доступ

Вопрос:

Привет, я не смог выполнить конкретную запись из моего двоичного файла. Это метод для вывода списка всех записей.

 int student :: showall(fstream amp;fp)
{
    student rec;
    fp.seekg(0,ios::beg);
    int i=0;
    cout<<"PositiontRoll NottNametBalance"<<endl;
    while(fp.read((char*)amp;rec,sizeof rec))
    {   
        cout<<i*sizeof rec<<"t";
        rec.show();
        i  ;
    }
}
 

Во время выполнения этого я получил следующий вывод

  Position Roll No     Name    Balance 0       1
 Heartly  10 28       2       
 Heartly  20 56       3       
 Heartly  30 84       4       
 Heartly  40 112      5
 Heartly  50 140      6       
 Heartly  60 168      7       
 Heartly  70 196      8
 Heartly  80 224      9       
 Heartly  90 252      10      
 Heartly  100
 

Теперь я хочу выполнить поиск по конкретной записи. Я дал RecNo 5 для поиска. Это мой метод просмотра

 int student :: view(fstream amp;fp,int RecNum)
{
    student rec;
    std::ios::pos_type SearchPosition = RecNum*sizeof rec;
    cout<<endl<<"Position="<<SearchPosition<<endl;
    if( fp.seekg(SearchPosition) == 0 )
    {
        cout<<endl<<"Position="<<SearchPosition<<endl;
            if(fp.read((char*)amp;rec,sizeof rec))
                    rec.show();
        else
            cout<<endl<<"Read Error .. ! "<<endl;
        }
    else
    {
        cout<<endl<<"Record Number Not Found"<<endl;
    }   
}
 

После запуска этого метода я получил результат ниже.

Номер записи (-1 отменяется): 5

Позиция = 140

Номер записи не найден

Почему он не находит конкретную запись?

 printf("nMenu : AddDummy, Add, View, Edit, List or Quit ( U, A, V, E, L or Q) : ");  switch(toupper(getchar()))  {     
     case 'U' :
        file.open("abc.cli",ios::in|ios::out|ios::binary|ios::app);
            cout<<"Creating dummy file of 1000 entries"<<endl;
            record.adddummy(file);
        file.clear();
            break;
    case 'A' :
        file.open("abc.cli",ios::in|ios::out|ios::binary|ios::app);
            record.get();
        record.add(record,file);
            cout<<"Record Added"<<endl;         
            file.clear();
            break;              
    case 'E' :      
            file.open("abc.cli",ios::in|ios::out|ios::binary|ios::ate);
            cout<<endl<<"Record number (-1 Cancels): "<<endl;
            cin>>Rec;
            if (Rec > -1){
                record.get();
         if(!record.update(record,file,Rec))
            cout<<"Record Edited"<<endl;            
             else
            cout<<"Record Edited Failed"<<endl;     
        file.clear();}
             break;
    case 'V' :      
             file.open("abc.cli",ios::in|ios::out|ios::binary|ios::ate);
             cout<<endl<<"Record number (-1 Cancels): "<<endl;
             cin>>Rec;
             if (Rec > -1)
                record.view(file,Rec);
         file.clear();
             break;
    case 'L' :
         file.open("abc.cli",ios::in|ios::out|ios::binary|ios::ate);
             record.showall(file); 
         file.clear();
             break; 
    case 'Q' :
            file.close();
        return 0;   
    default :
        cout<<" nNot Matchingn ";     
}while(getchar() != 'n');
 

Почему он не читает конкретную запись? введите код здесь

Комментарии:

1. Я попытался отформатировать ввод, я не думаю, что мне это удалось. Можете ли вы очистить его дальше?

2. Вам следует прочитать немного больше об этом seekg методе, особенно о том, что он возвращает.

Ответ №1:

fstream::seekg возвращает ссылку на fstream, никогда не будет равно 0. Таким образом, условие, которое вы проверяете, никогда не будет выполняться. fstream::seekg

Комментарии:

1. Большое вам спасибо!! опять один вопрос? В операторе switch, если я укажу ‘L’ для вывода списка, в первый раз он перечислит все. Но если я снова дам ‘L’ означает, что в нем ничего не указано? Но управление передается методу showall. Но это не входит в инструкцию read. почему?

2. Вы повторно открываете файл, почему?. Если вы повторно откроете файл, флаг failbit будет установлен, поэтому доступ, который вы сделали после, неверен.

3. правильно !! спасибо за помощь!! но как я могу проверить, записан файл или нет?