在处理二进制文件时了解 Seekg() 和 seekp()

Understanding Seekg() and seekp() when dealing with binary files

本文关键字:seekp Seekg 了解 处理 二进制文件      更新时间:2023-10-16

我是一名CS学生,我试图理解一段代码,但我无法理解它。这段代码允许用户修改二进制文件中的某个记录(结构(。我不明白records.seekg(recNum * sizeof(person), ios::beg); and records.seekp(recNum * sizeof(person), ios::beg);.为什么使用结构大小的指针来表示数。任何帮助将不胜感激。

void modify()
{
    int recNum;
    displayAll();
    fstream records("records.dat", ios::in | ios::out | ios::binary);   
    //get record number of the desired record.
    cout << "Which record do you want to edit? ";
    cin >> recNum;
    recNum = recNum - 1;
    records.seekg(recNum * sizeof(person), ios::beg);
    records.read(reinterpret_cast<char *>(&person), sizeof(person));
    cout << "ID   Age " << " " << "Name" << setw (28) << right << "Phonen";
    cout << person.id << "  " << left << setw(20) << person.name << right << setw(20) << person.phone << endl;
    //Get new record data.
    cout << "nEnter the new data:n";
    cout << "Id: ";
    cin >> person.id;
    cin.ignore();
    cout << "Name: ";
    cin.getline(person.name, NAME_SIZE);
    cout << "Age: ";
    cin >> person.age;
    cin.ignore();
    cout << "Phone: ";
    cin.getline(person.phone, PHONE_SIZE);
    records.seekp(recNum * sizeof(person), ios::beg);
    records.write(reinterpret_cast<char *>(&person),sizeof(person));
    records.close();
}

它不是指向大小的指针,星号只是一个乘法。 它将索引乘以文件中存储的元素的大小。

例如,如果每条记录为 20 个字节,则第一条记录的偏移量为 0,第二条记录的偏移量为 20,然后是 40、60,依此类推。