Как 7 правильный ответ, а не 6 в этом выводе - PullRequest
0 голосов
/ 01 апреля 2019

Предположим, что файл SCHOOLS.DAT создан с помощью объектов класса SCHOOLS, который определен ниже: класс ШКОЛЫ

class SCHOOLS
{
int SCode; // School Code
char SName[20]; // School Name
int NOT; // Number of Teachers in the school
public:
    void Display()
     {cout<<SCode<<"#"<<SName<<"#"<<NOT<<endl;}
      int RNOT(){return NOT;}
     };

Вопрос Найдите вывод следующего кода C ++, учитывая, что двоичный файл SCHOOLS.DAT существует на жестком диске со следующими записями 10 школ класс SCHOOLS, как заявлено в предыдущем.

SCode SName NOT

1001 Brains School 100

1003 Школа детской жизни 115

1002 Care Share School 300

1006 Школа образования для жизни 50

1005 Гуру Шишья Садан 195

1004 Священная школа образования 140

1010 Школа Рахмат Е Талим 95

1008 Innovate Excel School 300

1011 Высшая школа образования 200

1012 Школа поднятого сознания 100

void main()
{
 fstream SFIN;
 SFIN.open("SCHOOLS.DAT",ios::binary|ios::in);
 SCHOOLS S;
 SFIN.seekg(5*sizeof(S));
 SFIN.read((char*)&S, sizeof(S));
 S.Display();
 cout<<"Record :"<<SFIN.tellg()/sizeof(S) + 1<<endl;
 SFIN.close();
}

выход 1004 # Священная школа образования № 140 Запись: 7

Мой вопрос Как записать 7, а не 6.

Мой подход в качестве значения S будет 24. Получил его после добавления 2 байтов int Scode, 2 байтов int NOT, 20 байтов char SName [20].

, поэтому значение sizeof (S) будет равно 24, а значение SFIN.tellg будет равно 120, если их разделить, мы получим 5, а затем мы должны добавить 1. Значит, это будет 6, верно?

1 Ответ

1 голос
/ 01 апреля 2019

Вам даже не нужно думать о фактическом значении sizeof(S); просто относись к нему как к константе К.

Вы изначально стремитесь к позиции 5 * K. Затем вы читаете K байтов из файла, оставляя вас в позиции 6 * K. Это означает, что выражение SFIN.tellg()/sizeof(S) + 1 эквивалентно 6 * K / K + 1. K / K равно 1 для любого K, так что дополнительно упрощается до 6 * 1 + 1, что равно 7.

...