从文件中读取链接列表的输入和写入输出

时间:2014-05-14 16:48:16

标签: c++ visual-studio-2013

我正在处理混合类型的数字和字符串,所以我真的不知道如何做到这一点除了像

这样简单的事情
ifstream fin(filename);
fin >> a;
ofstream fout(filename);
fout << b;

这是我必须处理的结构

struct Reservation
{
    int ID;
    char name[MAX_NAME_LENGTH];
    char phone[MAX_PHONE_LENGTH];
    int gridironID;
    char hireDate[MAX_DATE_LENGTH];
    char resDate[MAX_DATE_LENGTH];
    char startTime[MAX_TIME_LENGTH];
    char endTime[MAX_TIME_LENGTH];
    bool isPay;

    Reservation *nextReservation;
};

我真的需要一些指导或方向来启动它,可能还有我应该使用的特定类型的功能或操作员?

编辑:啊是的我希望输出看起来像这样

100001,khang,01283478233,1,1,1,1,1,1

整个想法是在运行程序时从头开始读取文件的信息,为了创建基本资源进行交互,在完成所有操作后,你想打印出基础中的信息下次再次启动程序时的资源。

2 个答案:

答案 0 :(得分:1)

没有关于实际数据的一些信息 字符串,很难说,但基本上,你需要定义 功能:

std::ostream& operator<<( std::ostream& dest, Reservation const& source )
std::istream& operator>>( std::ostream& source, Reservation& dest );

您在功能中添加的内容取决于您拥有的数据 处理;你的第一步应该是确切地定义什么 你希望每条记录看起来像,记住它必须 在输入上明确无误。 (例如,如果你只使用白色 空格作为分隔符,如果有任何问题,你将遇到问题 字符串可以包含空格 - 通常可以包含名称。)

输出目标格式相对简单:输出 每个领域,有必要的分隔符等 经典的方式。输入更复杂,因为你需要 验证所需的分隔符实际存在;如果 最糟糕的是,你可能甚至不得不阅读字符 字符,例如如果你想使用引用的字符串作为名称:

std::string name;       //  Where we'll put the results;
source >> std::skipws;  //  Skip any leading white space
char ch;
if ( !source.get() || ch != '"' ) {
    source.setstate( std::ios_base::failbit );
}
while ( source.get( ch ) && ch != '"' ) {
    name += ch;
}
if ( ch != '"' ) {
    source.setstate( std::ios_base::failbit );
}

您可能希望添加代码来处理转义字符 循环,或禁止其他字符,如输入中的'\n'。这个 在循环中相当容易。请记住,随时 你看到任何你不喜欢的东西:设置std::ios_base::failbit。 除了告诉来电者出了什么问题之外,还有 以下输入将立即失败,无需解压缩 来自溪流的任何东西。

答案 1 :(得分:0)

对于输出,只需使用ostream界面(适用于cinfstream或...)

std::ostream& operator<<(std::ostream& stream, const Reservation& reservation) {
    stream 
           << reservation.ID << "," 
           << reservation.name << "," 
           //... and so on
}

对于解析输入,如果您可以假设字段将始终由单个','(无空格)分隔,并且您的字符串(如名称)不会包含逗号或空间,你可以这样做:

std::istream& operator>>(std::istream& stream, Reservation& reservation) {
    stream >> reservation.ID;
    stream::char_type ignored;
    stream >> ignored; // skip over ','

    std::string aString;
    stream >> aString; // read name
    // Now copy to char array. To make sure we don't overflow it,
    // cut string to MAX_NAME_SIZE, and leave additional space for the
    // terminating '\0'.
    aString = aString.substr(0, MAX_NAME_SIZE-1);
    strcpy(reservation.name, aString.c_str());

    // and so on..
}

但这是一个非常基本的解决方案。如果您的输入格式保证满足我上面提到的假设,并且您绝对不想使用第三方代码,那就足够了。但总的来说,我建议你找一个图书馆阅读和阅读。写CSV数据或类似数据。它使处理细节如引用字符串,额外的空格等更简单。

您仍然需要在Reservation s。

之间建立链接关系