Итак, этот вопрос задан в моей книге.
Он должен прочитать следующий код и ответить на вопрос, приведенный ниже:
#include<fstream.h>
class Book
{
int Bno;char title[20];
public:
void Enterval()
{
cin>>Bno;
cin.getline(title,20);
}
void ShowVal()
{
cout<<Bno<<"#"<<title<<endl;
}
};
void Search(int Recno)
{
fstream file;
Book B;
file.open("BOOKS.DAT",ios ::binary|ios :: in);
______________// statement 1
file.read((char*)& B,sizeof(B));
B.ShowVal();
file.close();
}
1)
поместить указатель файла в начало желаемой записи для чтения, которая отправляется как параметр функции (при условии, что RecNo 1 обозначает первую запись).
ответ дан
file.seekg((RecNo-1)*sizeof(B));
я просто хочу знать, почему они написали (RecNo-1).
Указатель файла в конце файла, когда он был открыт, и
это указывает на начало записи.
Также я хочу знать, может ли быть ответ
file.seekg(-1*sizeof(B),ios::cur);
так как мы должны читать с начала записи.
пожалуйста, скажите мне, если я прав, и поправьте меня, если не прав.
Помощь приветствуется.
Спасибо!
Указатель файла будет в начале файла при его открытии.
Для N-й записи утверждение будет
file.seekg((N-1)*sizeof(B));
Это связано с тем, что для просмотра или редактирования N-й записи вы должны переместить указатель на конец N-1-записи и затем прочитать ее, что и делает вышеупомянутый код.
Что вы предложили
file.seekg(-1*sizeof(B),ios::cur);
Не будет работать, так как вы только что открыли свой файл и пытаетесь перейти на позицию, которая существует до первой позиции в файле, что невозможно, поэтому этот код не будет работать.
Надеюсь, что это решит ваши вопросы
Для поиска файла, который содержит элементы одинакового размера, важно знать две вещи: с чего начинается моя запись и насколько она велика? Оба закодированы в заявлении
file.seekg((RecNo-1)*sizeof(B));
Каждая запись имеет размер
sizeof(B)
Поскольку записи идентифицируются по номеру книги, начинающемуся с 1, а первая запись начинается с первой позиции в файле (которая является позицией 0), необходимо вычесть 1 из каждого номера книги, чтобы получить индекс на основе 0. Затем умножение на размер записи дает вам начальную позицию для данной книги.
Заявление
file.seekg(-1*sizeof(B),ios::cur);
приведет к перемещению указателя текущего файла на один шаг размера записи назад. Но после открытия файла текущая позиция равна 0, что уже является началом файла. Более того, функция поиска, реализованная таким образом, никогда не будет использовать заданный номер книги, заставляя ее делать то же самое для каждого пропущенного вами номера книги.
Я бы предположил, что RecNo - 1
потому что автор хочет
индексирование в файл начинается с 1, а смещение в файл
начать с 0. При открытии файла начальная позиция будет на
начало файла. А также
file.seekg( -1 * sizeof(B), ios::cur );
должен произойти сбой, поскольку он пытается выполнить резервное копирование до начала файла.
Сказав, что с этим кодом так много проблем,
трудно начать. Кто бы ни написал это, не знает C ++.
Я думаю, что нумерация Recno
аргумент Search
Функция предназначена для «однократного», то есть первый элемент идентифицируется номером «1».
Позиция входного потока, с другой стороны, «основана на нуле» (как почти всегда в C и C ++), то есть первая доступная абсолютная позиция в потоке идентифицируется числом «0». Более того, если вы хотите прочитать 1-й Book
, вы должны начать с начала файла, поэтому вы должны искать позицию:
position := stream_first_pos + (Recno-1)*size_of_what_recno_refers_to
То есть, если вам нужна 1-я книга, т.е. Recno == 1
Ваша позиция перейдет к stream_first_pos
,
Решение, предложенное вами, т.е.
file.seekg(-1*sizeof(B),ios::cur);
неверно в том смысле, что поток не указывает на Recno
-й блок размера sizeof(Book)
, но он просто перемещает текущую позицию потока (в вашем случае, 0) «sizeof (B)» назад.