当程序执行操作时,我正在尝试编写程序 (例如:搜索,更新或添加),它应该是直接访问。该程序 不应该按顺序读取所有记录以达到记录。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct Student{
int Id;
int Money;
int Age;
char name[15];
};
void main(){
Student buffer;
ofstream BinaryFile("student", ios::binary);
ifstream WorkerText("worker.txt");
//-------------------------------------------------------------------------------------------------------------
while( WorkerText.good() ){
WorkerText>> buffer.Age >> buffer.name >> buffer.name >> buffer.name;
BinaryFile.write( (char *) &buffer, sizeof(Student) );
}
BinaryFile.close();
//-------------------------------------------------------------------------------------------------------------
ifstream ReadBinary( "student", ios::binary | ios::out );
while( BinaryFile.good() ){
ReadBinary.read((char*)&buffer,sizeof(Student));
cout<<buffer.Age;
}
//-------------------------------------------------------------------------------------------------------------
system("pause");
}
我坚持到这里我无法顺序阅读如何解决这个问题
答案 0 :(得分:1)
如果文件包含相同大小的结构,或者使用某个索引表,则可以跳过顺序读取。
对于相同尺寸的结构的情况:
void ReadStudent(istream &src, Student &dst)
{
src.read(&dst, sizeof(dst));
}
void GoToStudentIndex(istream &src, size_t idx)
{
src.seekg(idx * sizeof(Student), is.beg);
}
上述函数假设您正在编写数据如下:
void WriteStudent(ostream &dst, const Student &src)
{
dst.write(&src, sizeof(src));
}
答案 1 :(得分:0)
当您打开学生档案输入时,您正在使用“退出”模式:
ifstream ReadBinary( "student", ios::binary | ios::out );
^^^^^^^^ ^^^^^^^
试试这个:
ifstream ReadBinary("student", ios::binary);
ifstream
构造函数已经以输入模式(ios::in
)打开文件。
答案 2 :(得分:0)
有三种方法可以避免顺序读取:
答案 3 :(得分:0)
当我们想要搜索(和后续更新)但是按顺序将记录存储在平面文件中时,您需要有外部索引来帮助您直接访问所需的记录!在这种情况下,你想要按名称搜索学生,然后更新记录,你可以这样做:
// Store in map name and the position of record
std::map name2offset;
void writeRecord(const Student& student)
{
name2offset[string(student.name)]=BinaryFile.tellp();
BinaryFile.write(reinterpret_cast<char*>(&student), sizeof(Student));
}
// Return true if updated successfully else false.
bool update(const string& name, Student &newRecord)
{
std::map<char,long>::iterator itr = name2offset.find(name);
if (itr != name2offset.end()) {
BinaryFile.seekp(itr->second);
BinaryFile.write(reinterpret_cast<char*>(&newRecord), sizeof(Student));
return true;
}
return false;
}
这些都假设您的结构是固定大小的(在您的示例中)。