使用Seekp进行IO二进制写入;下移线条
IO Binary Writing Using Seekp; Moving Down Lines
这个程序应该创建一个名为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();
}
您似乎在混合二进制文件和格式化文本输出。如果您有一个二进制文件,为什么不使用未格式化的二进制read
和write
调用呢?如果使用格式化输出,则写入整数"1"的大小与整数"10"的大小不同。但在未格式化的二进制文件中,两者都使用4个字节(可能是4个字节)。
C++iostream有一个'g'(get)和'p'(put)位置。您需要使用正确的查找功能。
如果你正在阅读,你需要使用seekg
。如果你要写作,那么你需要seekp
。
我确信你至少在一个地方使用了错误的查找函数。
相关文章:
- 通过递归进行因子分解
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 使用libgit2、c++进行pull
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 如何使用模板函数的函数签名进行SFINAE
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 将模板化的类型与C++中的某些类/类型进行比较
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 如何对点云数据进行排序
- 从文本文件中读取时钟时间和事件时间并进行处理
- 对字符串进行位操作
- 是否可以使用winusb同时与多个相同的usb设备进行通信
- 是否可以对零模板参数进行模板专门化
- 对字符串进行排序时,在c++中处理sort()
- 试图对缓存进行跨步测试,但程序并没有结束
- 使用 seekp() 和 tellg() 进行数据处理
- 使用Seekp进行IO二进制写入;下移线条