【问题标题】:How 7 is the right answer and not 6 in this output在这个输出中 7 是正确答案而不是 6
【发布时间】:2019-03-31 22:55:45
【问题描述】:

假设创建了文件 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 大脑学校 100

1003 儿童生活学校 115

1002 关爱共享学校 300

1006 终身教育学校 50

1005 大师 Shishya Sadan 195

1004 圣教学校140

1010 Rahmat E Talim 学校 95

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

【问题讨论】:

  • 6 * sizeof(S) / sizeof(S) + 1 是 7,而不是 6。
  • 让我们X=sizeof(S)。然后6 * X / X + 1 = (6 * (X / X)) + 1 = (6 * 1) + 1 = 6 + 1 = 7.
  • @SurajGiri 你过了五,然后读了一个。 5 + 1 = 6。
  • seekg(5 * sizeof(S)) - 你在第 5 位 SCHOOL, read(... sizeof(S)) - 在你阅读之后,你在第 6 位 SCHOOLread 推进文件中的位置。因此,如果您从5 * sizeof(S) 开始并读取sizeof(S),文件中的位置将增加sizoef(S),因此您将在6 * sizeof(S) 结束。
  • @LightnessRacesinOrbit 我认为该文件实际上是二进制文件(“二进制文件 SCHOOLS.DAT ”),尽管内容列表看起来像是文本。

标签: c++ fstream data-handling


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 2021-12-30
    • 1970-01-01
    • 2022-01-21
    • 2019-05-04
    • 1970-01-01
    相关资源
    最近更新 更多