使用Seekp进行IO二进制写入;下移线条

IO Binary Writing Using Seekp; Moving Down Lines

本文关键字:Seekp 进行 IO 二进制 使用      更新时间:2023-10-16

这个程序应该创建一个名为Record.bin的二进制文件,然后将用户输入的所有信息写入该文件。现在,它到达了学生B[10]中读取的部分,并且正确地读取了B[0],但B[]的以下所有元素都差一步。当值是整数时,我不知道如何包含分隔符。

在那之后,我的寻找出现了一些问题,但我似乎不明白为什么。

          #include <iostream>
#include <cstring>
#include <sstream>
#include <istream>
#include <fstream>
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
struct Student
{
    char Name[20];
    char ANumber[9];
    int Age;
    float GPA;
};
int main(){
    Student A[10];
    Student B[10];
    for (int i = 0; i < 10; i++){
        cout << "Enter student's name" << endl;
        cin >> A[i].Name;
        cout << "Enter ANumber" << endl;
        cin >> A[i].ANumber;
        cout << "Enter Age" << endl;
        cin >> A[i].Age;
        cout << "Enter GPA" << endl;
        cin >> A[i].GPA;
    }
    fstream fout("Record.bin", ios::out | ios::binary);
    for (int i = 0; i < 10; i++){
        fout << A[i].Name << endl;
        fout << A[i].ANumber << endl;
        fout << A[i].Age << endl;
        fout << A[i].GPA << endl;
    }
    fout.close();
    fstream fin("Record.bin", ios::in);
    char tempe[50];
    for (int i = 0; i < 10; i++){
        fin.getline(B[i].Name, 25, 'n');
        fin.getline(B[i].ANumber, 25, 'n');
        fin.getline((char*)&B[i].Age, 25, 'n');
        fin.getline((char*)&B[i].GPA, 25, 'n');
    }
    fin.close();
    fin.open("Record.bin", ios::in);
    Student C;
    char*temp2 = "";
        fin.seekg(4 * sizeof(Student), ios::beg);
        fin.read((char*)&C.Name, sizeof(C.Name));
        fin.read((char*)&C.ANumber, sizeof(C.ANumber));
        fin.read((char*)&C.Age, sizeof(C.Age));
        fin.read((char*)&C.GPA, sizeof(C.GPA));
        fin.close();

     fin.open("Record.bin", ios::in | ios::out | ios::binary);
    fin.seekp(4 * sizeof(Student), ios::end);
    fin.write(C.Name, sizeof(C.Name));
    fin.write(C.ANumber, sizeof(C.ANumber));
    fin << C.Age;
    fin << C.GPA;
    fin.close();
}

您似乎在混合二进制文件和格式化文本输出。如果您有一个二进制文件,为什么不使用未格式化的二进制readwrite调用呢?如果使用格式化输出,则写入整数"1"的大小与整数"10"的大小不同。但在未格式化的二进制文件中,两者都使用4个字节(可能是4个字节)。

C++iostream有一个'g'(get)和'p'(put)位置。您需要使用正确的查找功能。

如果你正在阅读,你需要使用seekg。如果你要写作,那么你需要seekp

我确信你至少在一个地方使用了错误的查找函数。