Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2010, 18:11   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию чтение из файла

Добрый вечер, очень нужна ваша помощь. Почему то не читает из втрого файла вот код:
Код:
//===============================================================================
//              описание глобальных данных
//===============================================================================
	ifstream in;	//файловая переменная для ввода
	ofstream out;	//файловая переменная для вывода
	const int count = 5;  //максимальная разрядность числа


class longfloat	
{    
    public:
        int chislo[count];   //число
        bool znak;  //знак true=+, false=-
        int por;    //порядок числа
        int len; //длина числа
        friend istream& operator>>(istream& file, longfloat& a); 
        friend ostream& operator<<(ostream& file, longfloat& a);
		void dopol(longfloat& l1,longfloat& l2);	
		friend longfloat operator + (longfloat a, longfloat b);
};


istream& operator >> (istream& file,longfloat& a)
{
//=============================================================================
//		описание данных для ввода
//=============================================================================
    char sim;   //текущий символ
    bool flag = true; //наличие знака

//=============================================================================
//		инициализация массива
//=============================================================================
    for(int i=0;i<count;i++)
        a.chislo[i] = 0;

	file>>sim;
//=============================================================================
//		проверка знака
//=============================================================================    
    if(sim == '-')	//если число отрицательное
        a.znak = false;
    else if(sim == '+')	//если число положительное
        a.znak = true;
    else	//если знак не указан считаем число положительным
	{
        a.znak = true;
        flag = false;	//знака нет снова читаем этот символ
    }

	if(flag)	
		file>>sim;	//если знак был читаем следующий символ
    else
		flag = true;	

//=============================================================================
//			обработка и ввод числа
//=============================================================================    
    a.por=0;
    a.len = 0;	
  //  while(!in.eof())
	while(!in.eof())
	{
//=============================================================================
//			целая часть (представлена в инвертированном ввиде)
//=============================================================================    
        int i = count-1;	
        while((sim != '.')&&(!in.eof()))	
		{
            a.por++;
            a.len++;
            a.chislo[i] = sim-48;	
            i--;
            file>>sim;
        }
        file>>sim;

//=============================================================================
//			дробная часть (представлена в инвертированном ввиде)
//=============================================================================    
		while(!in.eof())
		{
            a.len++;
            a.chislo[i] = sim-48;
            i--;
            file>>sim;            
        }
    }
//=============================================================================
//			инвертирование обратно
//=============================================================================    
    int razn = count-a.len; //находим длину числа
    int tmp;    //вспомогательная переменнная для переворота
    int i=razn; //левая граница
    int j=count-1; //правая граница

    for(i,j;i<j;i++,j--)
	{
        tmp = a.chislo[i];
        a.chislo[i] = a.chislo[j];
        a.chislo[j] = tmp;
    }
    return file;
} 

ostream& operator << (ostream& file,longfloat& a)
{
//=============================================================================
//		описание данных
//=============================================================================
	int i = count-a.len;

//=============================================================================
//		проверка знака
//=============================================================================
    if(!a.znak)
        file<<'-';

//=============================================================================
//		обработка
//=============================================================================
    while(i<count)
	{
//=============================================================================
//		обработка целой части
//=============================================================================
	int nac=i+a.por;
	while(i<nac)	
	{
		file<<a.chislo[i];
		i++;
	}
//=============================================================================
//		вывод дробной части
//=============================================================================
		if(i<count)
			file<<'.';
        while(i<count)
		{
            file<<a.chislo[i];
            i++;
        }
    }
    return file;
}
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 13.04.2010, 18:11   #2
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Код:
void dopol(longfloat& l1,longfloat& l2)  //метод дополнения 0, возв дополненное
{
//=============================================================================
//		вычисление длинны дробной части чисел
//=============================================================================
	int drob1 = l1.len-l1.por;	//дробная часть певого числа
    int drob2 = l2.len-l2.por;	//дробная часть второго числа
    int drob_razn = drob1-drob2;	//разница длинны дробных частей

    if (drob_razn>0)	//певое больше выравниваем второе
    {
        int nach = count - drob1 - 1;	//указатель на будующую позицию первого числа
        int end = count - drob2 - 1; //указатель на конец
        int i,j;

//=============================================================================
//			перенос числа на необходимое количество разрядов
//=============================================================================
        for(i=nach,j=end;j<count;i++,j++)
		{
            l2.chislo[i] = l2.chislo[j];
            l2.chislo[j] = 0;
        }
        l2.len += abs(drob_razn); //увеличение длинны числа
    }

    else if (drob_razn<0)   //второе больше выравниваем первое
    {
        int nach = count - drob2 - 1;	//указатель на будующее начало
        int end = count - drob1 - 1; //указатель на конец
        int i,j;
//=============================================================================
//			перенос числа на необходимое количество разрядов
//=============================================================================
        for(i=nach,j=end;j<count;i++,j++)
		{
            l1.chislo[i] = l1.chislo[j];
            l1.chislo[j] = 0;
        }
		l1.len += abs(drob_razn);
    }
}
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 13.04.2010, 18:11   #3
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Код:
longfloat operator + (longfloat a, longfloat b)
{
    dopol(a,b);
    int i;
    int v_ume = 0;	//то что запоминается
        for(i=count-1;i>0;i--)
		{
	            if(v_ume != 0)	//если в уме что-то есть прибавляем
                    a.chislo[i] = a.chislo[i]+b.chislo[i]+v_ume;	
	            else	//в противном случае ничего не прибавляем
		            a.chislo[i] = a.chislo[i]+b.chislo[i];
                
	            if(a.chislo[i]/10 != 0)	//если число не помещается в разряд то записываем 10 часть в ум
				{
		            v_ume = a.chislo[i]/10;
		            a.chislo[i] = a.chislo[i] % 10;
	            }
	            else	//обнуляем в уме
		            v_ume = 0;
        }

        if(a.chislo[count-a.len-1] != 0)	//размер числа может быть увеличен
		{
            a.len++;
        }
    return a;
}


//=============================================================================
//			главная программа
//=============================================================================
void main()
{	
//=============================================================================
//			описание данных
//=============================================================================
	char operation;	//операция которую нужно будет произвести
    longfloat p1,p2;	//аргументы
	longfloat res;
//=============================================================================
//			проверка
//=============================================================================
    in.open("first.txt");
	in>>p1;
	in.open("last.txt");
	in>>p2;
     res=p1+p2;
    out.open("res.txt");
    out<<res;
    getchar();
}
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 13.04.2010, 18:30   #4
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

В функции перегрузки оператора >> ты пишешь
Код:
whle(!in.eof())
а надо
Код:
while(!file.eof())
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 13.04.2010, 18:35   #5
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

все равно при считывании второго числа файл пуст, хотя там есть значение
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 13.04.2010, 18:47   #6
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

все вопрос закрыт
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение из файла (С) spirit_trapper Помощь студентам 4 26.05.2010 19:37
[C++] чтение из файла proga. Помощь студентам 1 25.09.2009 23:28
Чтение из файла Arkuz Общие вопросы Delphi 14 08.10.2008 19:52
Чтение файла [Smarik] Помощь студентам 8 28.04.2008 22:15
Чтение файла Stanislav Общие вопросы Delphi 18 24.11.2007 20:45