C++ 将空白记录写入二进制文件时的无限循环

C++ 将空白记录写入二进制文件时的无限循环,c++,binaryfiles,C++,Binaryfiles,以下简短程序的目的是在二进制文件(包含不同列车的详细信息)中搜索特定列车(其编号已被用户接受),然后在该位置重写空白记录 也就是说,我希望“删除”该列车记录 问题是程序进入无限循环,并重复将空白记录写入二进制文件,从而导致创建一个巨大的2GB.dat文件 #include<iostream.h> #include<fstream.h> struct train { int train_no; char train_name[50], source[20]

以下简短程序的目的是在二进制文件(包含不同列车的详细信息)中搜索特定列车(其编号已被用户接受),然后在该位置重写空白记录

也就是说,我希望“删除”该列车记录

问题是程序进入无限循环,并重复将空白记录写入二进制文件,从而导致创建一个巨大的2GB.dat文件

#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();
}