Объектно-ориентированное программирование на C++. Андрианова А.А - 130 стр.

UptoLike

Андрианова А.А., Исмагилов Л.Н., Мухтарова Т.М.
В том же формате будет осуществляться и ввод данных из потока.
Разделителем между двумя дробными числами, записанными в файле,
будет являться символ табуляции ('\t') или символ конца строки
('\n'). Данные из входного потока считываются в строку, а затем
производится разделение на составные части числа знак, целую часть,
числитель и знаменатель.
// операция ввода рациональной дроби
istream& operator >>(istream& fin, Fraction& a)
{
char buf[30];
// считывается число в строку
// если считывание происходит из файла,
// строка вводится до разделителя
if(typeid(ifstream) == typeid(fin))
fin.getline(buf, 29, '\t');
else
fin.getline(buf, 29);
// находим первое вхождение символа '/' в строку
char* ps = strchr(buf, '/');
// если символ не найден,
// т.е. число - без дробной части
if(ps == NULL)
{
// из строки выделяем целую часть
sscanf(buf, "%d", &a.intPart);
a.numerator = 0;
a.denominator = 1;
//знак числа определяется по знаку целой части
if(a.intPart >= 0)
a.sign = 1;
else
{
a.sign = -1;
a.intPart = -a.intPart;
}
return fin;
}
// если число без целой части
if(strchr(buf, ' ')==NULL)
{
a.intPart = 0;
// считываем из строки числитель и знаменатель
sscanf(buf, "%d/%d",
&a.numerator, &a.denominator);
//знак числа определяется по знаку числителя
130
                               Андрианова А.А., Исмагилов Л.Н., Мухтарова Т.М.

    В том же формате будет осуществляться и ввод данных из потока.
Разделителем между двумя дробными числами, записанными в файле,
будет являться символ табуляции ('\t') или символ конца строки
('\n'). Данные из входного потока считываются в строку, а затем
производится разделение на составные части числа – знак, целую часть,
числитель и знаменатель.

      // операция ввода рациональной дроби
      istream& operator >>(istream& fin, Fraction& a)
      {
           char buf[30];
           // считывается число в строку
           // если считывание происходит из файла,
           // строка вводится до разделителя
           if(typeid(ifstream) == typeid(fin))
                fin.getline(buf, 29, '\t');
           else
                fin.getline(buf, 29);
           // находим первое вхождение символа '/' в строку
           char* ps = strchr(buf, '/');
           // если символ не найден,
           // т.е. число - без дробной части
           if(ps == NULL)
           {
                // из строки выделяем целую часть
                sscanf(buf, "%d", &a.intPart);
                a.numerator = 0;
                a.denominator = 1;
                //знак числа определяется по знаку целой части
                if(a.intPart >= 0)
                     a.sign = 1;
                else
                {
                     a.sign = -1;
                     a.intPart = -a.intPart;
                }
                return fin;
           }
           // если число без целой части
           if(strchr(buf, ' ')==NULL)
           {
                a.intPart = 0;
                // считываем из строки числитель и знаменатель
                sscanf(buf, "%d/%d",
                                &a.numerator, &a.denominator);
                //знак числа определяется по знаку числителя

130