当istream在main中时,在实现文件中使用getline

时间:2014-02-10 16:12:38

标签: visual-c++ getline file-handling

我需要使用函数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';

代码工作得很好。

1 个答案:

答案 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'作为分隔符。