0

假设文件 SCHOOLS.DAT 是借助 SCHOOLS 类的对象创建的,它定义如下: 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;}
     };

问题 考虑到二进制文件SCHOOLS.DAT 存在于硬盘上,并且上面声明的SCHOOLS 类的10 所学校的记录如下,找到以下C++ 代码的输出。

SCode SName NOT

1001 大脑学校 100

1003 儿童生活学校 115

1002 关爱共享学校 300

1006 终身教育学校 50

第1005章 195

1004圣教学校140

1010 拉赫马特 E 塔利姆学校 95

1008 创新卓越学校 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 对吗?

4

1 回答 1

1

你甚至不需要考虑 ; 的实际值sizeof(S)。只需将其视为常数 K。

您最初寻求位置 5*K。然后你从文件中读取 K 个字节,将你留在 6*K 的位置。这意味着表达式SFIN.tellg()/sizeof(S) + 1等价于 6*K/K + 1。对于任何 K,K/K 等于 1,因此进一步简化为 6*1 + 1,即等于 7。

于 2019-03-31T23:18:29.720 回答