我正在处理混合类型的数字和字符串,所以我真的不知道如何做到这一点除了像
这样简单的事情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
整个想法是在运行程序时从头开始读取文件的信息,为了创建基本资源进行交互,在完成所有操作后,你想打印出基础中的信息下次再次启动程序时的资源。
答案 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
界面(适用于cin
或fstream
或...)
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。