附加一个随机访问文件
Appending a Random Access File
我在附加随机访问文件时遇到问题。我似乎无法覆盖文件中的字段。相反,我只向文件追加内容,并保留旧名称。
fstream Airline("AirLine.text", ios::out | ios::in | ios::app | ios::binary);
if(!Airline)
{
cout << "File Could not be opened." << endl;
system("PAUSE");
exit (1);
}
cout << "Enter Seat Number to Update" << "(1 to 100, 0 to end)?";
NewPassenger passenger;
cin >> passenger.seat_number;
while (0 < passenger.seat_number && passenger.seat_number <= 100)
{
Airline.seekp((passenger.seat_number - 1 ) * sizeof(NewPassenger));
Airline.read(reinterpret_cast<char *>(&passenger), sizeof(NewPassenger));
cout << " Found Record. Now Enter New Name:";
cin >> passenger.name;
Airline.seekg((passenger.seat_number - 1 ) * sizeof(NewPassenger),ios::beg);
Airline.write(reinterpret_cast<const char *>(&passenger), sizeof(NewPassenger));
cout << "nEnter Seat Number: ?";
cin >> passenger.seat_number;
}
Airline.close();
cout << endl;
NewPassenger
定义如下:
struct NewPassenger
{
int seat_number;
char name[20];
char onward[3];
};
fstream Airline("AirLine.text", ios::out | ios::in | ios::app | ios::binary);
查看fstream::open
上的cplusplus.com,我看到附加标志被描述为
app (append)在每次输出操作之前,将流的位置指示器设置为流的末尾
(重点)。看起来你得到了你想要的行为。也许你需要
ate (at end)在打开时将流的位置指示器设置为流的末端。
使用正确位置参数的seekg
:
seekg(abs_pos, std::ios::beg); // seek relative to the beginning
默认为std::ios::cur
,即相对于当前位置。
与seekp
相同。
具体地说:
Airline.seekp((passenger.seat_number - 1 ) * sizeof(Newpassenger), std::ios::beg);
// ^^^^^^^^^^^^^^^
相关文章:
- 使用std::mt19937从字符串中返回一个随机单词
- 如何生成一个随机的 n 位数,其中 n 是任意的
- 当我尝试使用它时,Scanf 会抛出一个随机异常(scanf_s 也是如此)
- 我将如何在 cpp 中生成一个随机且独特的标题
- 从C++数组中选择一个随机元素
- 如何更改此notify_one以便它选择一个随机线程
- C++ 在运行时选择一个随机对象
- C++ 制作一个随机数字/字母生成器,代码中有问题
- 将一个随机的字符序列和int序列解析为单独的向量
- C 从向量的子集返回一个随机值
- 如何创建一个随机访问式的Rreference以访问.RC文件中定义的资源
- 在C 11中生成一个随机字符串
- 创建一个随机的std ::向量,其中一个和零C
- C/C++ - 生成一个随机字符串会覆盖以前的字符串(请参阅下面的代码)
- 需要在指定范围内生成一个随机整数
- 生成一个随机种子给srand()-不是时间(NULL)
- 选择一个随机方块并生成一个随机数
- 是否有一个随机函数可以生成 0 到 1 之间的数字
- 随机坐标和禁用下一个随机集的移动
- 如何在QtCreator(Linux Ubuntu)中编译和运行一个随机的单个C++文件