C++ 在记录中定位文件指针

C++ 在记录中定位文件指针,c++,data-files,C++,Data Files,这就是我书中提出的问题 阅读以下代码并回答以下问题: #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 Se

这就是我书中提出的问题

阅读以下代码并回答以下问题:

#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();
}
我只是想知道他们为什么要写(RecNo-1)。 文件指针在文件打开和关闭时位于文件末尾 它指向记录的开头吗

我也想知道答案是否是

file.seekg(-1*sizeof(B),ios::cur);
因为我们必须从reord的开头开始阅读

请告诉我是否正确,如果错误请纠正我

谢谢你的帮助


谢谢

要查找包含相同大小元素的文件,有两件事很重要:我的记录从哪里开始?它有多大?两者都在语句中编码

file.seekg((RecNo-1)*sizeof(B));
file.seekg(-1*sizeof(B),ios::cur);
每个记录都有大小

sizeof(B)
由于条目由从1开始的图书编号标识,并且第一个条目从文件中的第一个位置(即位置0)开始,因此必须从每个图书编号中减去1以获得基于0的索引。然后,与记录大小相乘得到给定书本的起始位置

声明

file.seekg((RecNo-1)*sizeof(B));
file.seekg(-1*sizeof(B),ios::cur);

将导致当前文件指针向后移动一个记录大小的步骤。但是打开文件后,当前位置为0,这已经是文件的开始。此外,以这种方式实现的函数搜索永远不会使用给定的书号,因此它会对您传递的每个书号执行相同的操作。

要查找包含相同大小元素的文件,有两件事很重要:我的记录从何处开始?它有多大?两者都在语句中编码

file.seekg((RecNo-1)*sizeof(B));
file.seekg(-1*sizeof(B),ios::cur);
每个记录都有大小

sizeof(B)
由于条目由从1开始的图书编号标识,并且第一个条目从文件中的第一个位置(即位置0)开始,因此必须从每个图书编号中减去1以获得基于0的索引。然后,与记录大小相乘得到给定书本的起始位置

声明

file.seekg((RecNo-1)*sizeof(B));
file.seekg(-1*sizeof(B),ios::cur);

将导致当前文件指针向后移动一个记录大小的步骤。但是打开文件后,当前位置为0,这已经是文件的开始。此外,以这种方式实现的函数搜索永远不会使用给定的书号,这会导致它对您传递的每个书号都执行相同的操作。

我的猜测是,
Search
函数的
Recno
参数的编号是“基于一”的,即第一个元素由数字“1”标识.

另一方面,输入流位置是“基于零的”(与C和C++中的几乎所有内容一样),即流中第一个可用的绝对位置由数字“0”标识。此外,如果您想阅读第一本
,则必须从文件的开头开始,因此您应该查找以下位置:

position := stream_first_pos + (Recno-1)*size_of_what_recno_refers_to
也就是说,如果您想要第一本书,即
Recno==1
,您的位置将转到
流\u first\u pos

您自己提出的解决方案,即:

file.seekg(-1*sizeof(B),ios::cur);

不正确,因为它不会使流指向大小
sizeof(Book)
的第
Recno
-th块,但它只是移动流的当前位置(在您的情况下为0)“sizeof(B)”返回位置。

我猜
搜索
函数的
Recno
参数的编号是“基于一”的,即第一个元素由数字“1”标识

另一方面,输入流位置是“基于零的”(与C和C++中的几乎所有内容一样),即流中第一个可用的绝对位置由数字“0”标识。此外,如果您想阅读第一本
,则必须从文件的开头开始,因此您应该查找以下位置:

position := stream_first_pos + (Recno-1)*size_of_what_recno_refers_to
也就是说,如果您想要第一本书,即
Recno==1
,您的位置将转到
流\u first\u pos

您自己提出的解决方案,即:

file.seekg(-1*sizeof(B),ios::cur);

这是不正确的,因为它不会使流指向大小
sizeof(Book)
的第
Recno
-th块,但它只是将流的当前位置(在您的示例中为0)“sizeof(B)”位置移回。

我认为
Recno-1
是因为作者想要 索引到文件中以从1开始,而偏移到文件中 从0开始。打开文件时,初始位置将位于 文件的开头。及

file.seekg( -1 * sizeof(B), ios::cur );
应该失败,因为它尝试在文件开始之前备份

话虽如此,这段代码有太多的错误,它是
很难开始。无论谁写的都不知道C++,

< p>我假定“代码”>1—<代码>是因为作者想要的。 索引到文件中以从1开始,而偏移到文件中 从0开始。打开文件时,初始位置将位于 文件的开头。及

file.seekg( -1 * sizeof(B), ios::cur );
应该失败,因为它尝试在文件开始之前备份

话虽如此,这段代码有太多的错误,它是
很难开始。谁写的它不知道C++。

文件指针将在文件打开时开始。< /P> 对于第n条记录,该语句为

file.seekg((N-1)*sizeof(B));
这是因为要查看或编辑第N条记录,必须将指针移动到N-1条记录的末尾,然后读取它,这就是上面提到的代码所做的

你的建议是什么

file.seekg(-1*sizeof(B),ios::cur);
将无法工作,因为您刚刚打开文件,并且正在尝试转到文件中第一个位置之前存在的位置,这是不可能的,因此此代码将无法工作


希望这能解决您的问题

打开文件时,文件指针将位于文件的开头

对于第n条记录,该语句为

file.seekg((N-1)*sizeof(B));
这是因为要查看或编辑第N条记录,您必须将指针移动到N-1条记录的末尾,然后读取它,这就是上面提到的