#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. правильно !! спасибо за помощь!! но как я могу проверить, записан файл или нет?