C++ 将空白记录写入二进制文件时的无限循环
以下简短程序的目的是在二进制文件(包含不同列车的详细信息)中搜索特定列车(其编号已被用户接受),然后在该位置重写空白记录 也就是说,我希望“删除”该列车记录 问题是程序进入无限循环,并重复将空白记录写入二进制文件,从而导致创建一个巨大的2GB.dat文件C++ 将空白记录写入二进制文件时的无限循环,c++,binaryfiles,C++,Binaryfiles,以下简短程序的目的是在二进制文件(包含不同列车的详细信息)中搜索特定列车(其编号已被用户接受),然后在该位置重写空白记录 也就是说,我希望“删除”该列车记录 问题是程序进入无限循环,并重复将空白记录写入二进制文件,从而导致创建一个巨大的2GB.dat文件 #include<iostream.h> #include<fstream.h> struct train { int train_no; char train_name[50], source[20]
#include<iostream.h>
#include<fstream.h>
struct train {
int train_no;
char train_name[50], source[20], dest[20];
int n_AC1, n_AC2, n_ACC, n_FC, n_SLC, n_SS; // variables for no of seats
train() { //default constructor
train_no = 0;
n_AC1=0, n_AC2=0, n_ACC=0, n_FC=0, n_SLC=0, n_SS=0;
strcpy(train_name, "/0");
strcpy(source, "/0");
strcpy(dest, "/0");
}
//member functions to accept and display the above values
};
void remove_train(fstream &f) {
train t, blank;
int tno, found = 0;
do {
cout<<"Enter the train no: ";
cin>>tno;
if(tno <=0)
cout<<"Invalid train number. Please re-enter."<<endl;
}
while(tno <=0);
f.seekg(0L, ios::beg);
f.read((char*)&t, sizeof(train));
while(!f.eof() && !found) {
if(t.train_no == tno) {
found = 1;
f.seekp(-sizeof(train), ios::cur);
f.write((char*)&blank, sizeof(train));
cout<<"Train number "<<tno<<" has been deleted!"<<endl;
}
else
f.read((char*)&t, sizeof(train));
}
if(found == 0)
cout<<"ERROR: train not found."<<endl;
}
int main() {
fstream f("Trains.dat", ios::binary | ios::in | ios::out);
remove_train(f);
cin.ignore();
cin.get();
}
主要编辑:当我将-sizeof(train)替换为-110L(这是“train”结构的字节大小)时,问题得到了解决!你知道为什么会这样吗 我必须说,在您的代码中发现错误,我感到不知所措。我已经运行了它的一个副本,它按预期工作 这里有一些小错误(例如,如果您的数据文件不存在,它将失败),代码当然可以改进(您对f.eof()的使用有点笨拙),但没有什么可以解释您所描述的行为 这是我现在运行的确切版本。除了一些额外的代码来创建一个虚拟数据文件和一些调试输出,我看不出与您的有什么不同 也许您可以尝试编译它,看看它是否在您的环境中失败
#include<iostream>
#include<fstream>
#include <string.h>
using namespace std;
struct train {
int train_no;
char train_name[50], source[20], dest[20];
int n_AC1, n_AC2, n_ACC, n_FC, n_SLC, n_SS; // variables for no of seats
train() { //default constructor
train_no = 0;
n_AC1=0, n_AC2=0, n_ACC=0, n_FC=0, n_SLC=0, n_SS=0;
strcpy(train_name, "");
strcpy(source, "");
strcpy(dest, "");
}
//member functions to accept and display the above values
};
void remove_train(fstream &f) {
train t, blank;
int tno, found = 0;
do {
cout<<"Enter the train no: ";
cin>>tno;
if(tno <=0)
cout<<"Invalid train number. Please re-enter."<<endl;
}
while(tno <=0);
cout<<"deleting train "<<tno<<endl;
f.seekg(0L, ios::beg);
f.read((char*)&t, sizeof(train));
while(!f.eof() && !found) {
cout<<f.tellp()<<endl;
if(t.train_no == tno) {
found = 1;
f.seekp(-sizeof(train), ios::cur);
cout<<"delete "<<f.tellp()<<"/"<<f.tellg()<<endl;
f.write((char*)&blank, sizeof(train));
cout<<"Train number "<<tno<<" has been deleted!"<<endl;
}
else
{
cout<<"read "<<f.tellg()<<endl;
f.read((char*)&t, sizeof(train));
}
}
if(found == 0)
cout<<"ERROR: train not found."<<endl;
else
cout<<"done"<<endl;
}
void create_trains(int n)
{
fstream f("Trains.dat", ios::binary | ios::out);
train t;
for (int i = 1 ; i <= n ; i++)
{
t.train_no = i;
f.write((char*)&t, sizeof(train));
}
}
int main() {
create_trains (10);
fstream f("Trains.dat", ios::binary | ios::in | ios::out);
remove_train(f);
cin.ignore();
cin.get();
}
#包括
#包括
#包括
使用名称空间std;
结构列车{
国际列车号;
字符序列名称[50],源[20],目标[20];
int n_AC1、n_AC2、n_ACC、n_FC、n_SLC、n_SS;//座椅数量的变量
train(){//默认构造函数
列车号=0;
n_AC1=0,n_AC2=0,n_ACC=0,n_FC=0,n_SLC=0,n_SS=0;
strcpy(列车名称“”);
strcpy(来源“”);
strcpy(dest,“”);
}
//成员函数接受并显示上述值
};
无效移除列车(fstream&f){
t列,空白;
int tno,found=0;
做{
库特诺;
如果(tno)我发现while(!f.eof()…)
非常可疑。不知道这是否能解决问题,但是结构列的初始化在strcpy
处似乎是错误的:您应该键入strcpy(train\u name,“\0”);
而不是strcpy(train\u name,“/0”)这是在其他两个<代码> StrucP命令之后发生的。C++是僵尸,只有更残酷。因此规则17:总是在到达语句“代码> >查找=1时,检查你的退出条件;< /COD>应该留下循环。你应该尝试使用调试器,查看变量和程序流。设置BRE。我在写空白记录后尝试使用断言,但是问题仍然存在。如果我听起来很幼稚,我就道歉。但是我如何使用调试器呢?我正在使用的IDE是DEV C++。顺便说一下,是的,你的代码工作得很好。更令人困惑的是,我提到的问题在我替换SI时是固定不变的。zeof(train)和-110L(实际上是“train”结构的字节大小)!知道为什么会这样吗?
#include<iostream>
#include<fstream>
#include <string.h>
using namespace std;
struct train {
int train_no;
char train_name[50], source[20], dest[20];
int n_AC1, n_AC2, n_ACC, n_FC, n_SLC, n_SS; // variables for no of seats
train() { //default constructor
train_no = 0;
n_AC1=0, n_AC2=0, n_ACC=0, n_FC=0, n_SLC=0, n_SS=0;
strcpy(train_name, "");
strcpy(source, "");
strcpy(dest, "");
}
//member functions to accept and display the above values
};
void remove_train(fstream &f) {
train t, blank;
int tno, found = 0;
do {
cout<<"Enter the train no: ";
cin>>tno;
if(tno <=0)
cout<<"Invalid train number. Please re-enter."<<endl;
}
while(tno <=0);
cout<<"deleting train "<<tno<<endl;
f.seekg(0L, ios::beg);
f.read((char*)&t, sizeof(train));
while(!f.eof() && !found) {
cout<<f.tellp()<<endl;
if(t.train_no == tno) {
found = 1;
f.seekp(-sizeof(train), ios::cur);
cout<<"delete "<<f.tellp()<<"/"<<f.tellg()<<endl;
f.write((char*)&blank, sizeof(train));
cout<<"Train number "<<tno<<" has been deleted!"<<endl;
}
else
{
cout<<"read "<<f.tellg()<<endl;
f.read((char*)&t, sizeof(train));
}
}
if(found == 0)
cout<<"ERROR: train not found."<<endl;
else
cout<<"done"<<endl;
}
void create_trains(int n)
{
fstream f("Trains.dat", ios::binary | ios::out);
train t;
for (int i = 1 ; i <= n ; i++)
{
t.train_no = i;
f.write((char*)&t, sizeof(train));
}
}
int main() {
create_trains (10);
fstream f("Trains.dat", ios::binary | ios::in | ios::out);
remove_train(f);
cin.ignore();
cin.get();
}