我需要使用函数getline来读取字符串中的空格。目前,我正在逐字逐句阅读,任何空格都会将下一个单词输入到另一个变量中。代码的一小部分如下所示。
istream & operator >>( istream & input, Unit & C )
{
input >> C.unID >> C.unName >> C.credits >> C.Result >> C.mDay >> C.mMonth >> C.mYear;
return input;
}
ostream & operator <<( ostream & os, const Unit & C )
{
os << " Unit ID: " << C.unID << '\n';
os << " Unit Name: " << C.unName << '\n'
<< " Credits: " << C.credits << '\n'
<< " Result: " << C.Result << " marks" << '\n'
<< " Date: " << C.mDay << " " << C.mMonth << " " << C.mYear << '\n';
return os;
}
请注意,我只需要getName for getName。
至于infile,它在我的main.cpp中。代码如下。
ifstream infile( "rinput.txt" );
if( !infile ) return -1;
Student R;
infile >> R;
ofstream ofile( "routput.txt" );
ofile << R
<< "Number of units = " << R.GetCount() << '\n'
<< "Total credits = " << R.GetCredits() << '\n';
代码工作得很好。
答案 0 :(得分:0)
如果我了解您要执行的操作,则问题不在于您的代码,而在于您如何组织输入。在您的代码中,如果您有Unit::unName
包含空格而Unit的所有其他字段都不包含空格,则需要自己解析您的行。输入必须正确格式化。例如,如果在输入文件/ stdin中使用的分隔符(例如',')未出现在任何有效的unName或unId等中,则可以使用
istream & operator >>( istream & input, Unit & C ) {
input >> C.unID; getline(input,C.unName,','); input >> C.credits; ...
}
代替,
istream & operator >>( istream & input, Unit & C )
{
input >> C.unID >> C.unName >> C.credits >> C.Result >> C.mDay >> C.mMonth >> C.mYear;
return input;
}
在上面,重载的表单istream& getline (istream& is, string& str, char delim);
使用分隔符(如','或'\ t')来替换默认的\n
。您需要使用带分隔符的输入行格式,因为否则程序将无法判断是否为200
1 John Smith 200
应该是unName字段或信用字段的一部分。
因此,您可以将其更改为
1,John Smith,200,......
并使用','作为分隔符或更改
的输入1 约翰·史密斯 200 ...
并使用默认的'\ n'作为分隔符。