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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.09.2015, 21:14   #91
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Для понимания указателей

Ребят, почему-то в коде все верно, кроме, дублируется последнее введенное число

если последнее число положительное и считалось из файла общего, то в файл положительных чисел записывается еще раз, так же и с отрицательными, например:

ВСего чисел - 6
Общий файл
-1
2
3
5
-5
-25

Файл с положительными:
2
3
5
файл с отрицательными:
-1
-5
-25
-25 // почему так?

Код:
#include <iostream>
#include <fstream>


using std::cout;
using std::cin;
using std::ofstream;
using std::ifstream;


int main()
{

    int count=0;
    float chislo=0;
   

    cout<<"Vvedite kolichestvo strok v file:...";
    cin>>count;

    ofstream *file1= new ofstream("d://vesh.txt");

    for (int i=0;i<count;i++)
    {
        cout<<"input chislo No: "<<i+1<<"\n";
        cin>>chislo;
        *file1<<chislo<<"\n";
    }

    file1->close();
    delete file1;




    ifstream *file_read=new ifstream("d://vesh.txt");
    ofstream *file2=new ofstream ("d://pologitelnie.txt");
    ofstream *file3=new ofstream("d://otric.txt");


    while (*file_read)
    { *file_read>>chislo;
      (chislo>=0) ?*file2<<chislo<<"\n":*file3<<chislo<<"\n";
    }



    file_read->close();
    file2->close();
    file3->close();
    delete file2;
    delete file3;
    delete file_read;
    cout<<"Done!";

    return 0;
}
В общем если основной файл состоит из 6 чисел, то...

В первом варианте цикла - 6 итераций, и работает отлично, а во втором варианте-7 итераций цикла и создается дубль последнего числа одного из файлов

А вот если цикл исправить так, то все ОК
Код:
  while (*file_read>>chislo)  
        (chislo>=0) ?
                    *file2<<chislo<<"\n":
                            *file3<<chislo<<"\n";
Если цикл заполнения такой, то не Ок

Код:
  while (*file_read)
    { *file_read>>chislo;
      (chislo>=0) ?*file2<<chislo<<"\n":*file3<<chislo<<"\n";
    }
Кто-нибудь знает почему так? Именно в случае тогда, когда используется указатель на поток. Кто-нибудь знает как можно исправить мой первый цикл так, чтоб работало, но не было похоже не второй?
from dark to light)

Последний раз редактировалось Stilet; 06.09.2015 в 10:20.
Алексей_2012 вне форума Ответить с цитированием
Старый 06.09.2015, 02:41   #92
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Кто-нибудь знает почему так?
Потому что при этом:
Код:
*file_read>>chislo
поток перейдет в ошибочное состояние в случае ошибки чтения, а значит при
Код:
while (*file_read) //После считывания последнего числа здесь всё ок, поток в нормальном состоянии
{ 
   //А вот здесь уже пытаемся читать "за концом" файла, а значит переходим в eof
   *file_read>>chislo; //только здесь в потоке выставится eofbit.
   (chislo>=0) ?*file2<<chislo<<"\n":*file3<<chislo<<"\n"; //А значит в файл запишется еще одно число
}
Ну а в случае с
Код:
while (*file_read>>chislo)//Если считывание за концом файла, то выставляется eof
Croessmah вне форума Ответить с цитированием
Старый 06.09.2015, 04:17   #93
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Возможно ли избежать этого? Используя вариант где считывание происходит не в аргументе цикла?
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 06.09.2015, 07:26   #94
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Цитата:
Сообщение от Алексей_2012 Посмотреть сообщение
Тогда легче создать много глобальных переменных и не обязательно указателей...
В Басике, всегда все переменные - глобальные. В С++ от них частично отказались и не зря. Да. Глобалка не требует ухищьрений с указателями. Но, есть и подводный камень. Глобалку может изменить ЛЮБАЯ функция, а это чревато непредсказуемыми последствиями. Уж лучше извращения, чем глобалка моё ИМХО.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 06.09.2015, 09:32   #95
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Возможно ли избежать этого? Используя вариант где считывание происходит не в аргументе цикла?
Код:
while (*file_read) 
{ 
   *file_read>>chislo;
   if ( file_read -> good() )
      (chislo>=0) ?*file2<<chislo<<"\n":*file3<<chislo<<"\n";
}
Цитата:
В Басике, всегда все переменные - глобальные.
Еще и прожорливый и неповоротливый Variant

Последний раз редактировалось Аватар; 06.09.2015 в 09:57.
Croessmah вне форума Ответить с цитированием
Старый 09.09.2015, 12:39   #96
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

А как-нибудь проще можно написать программу? Упростить.
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
указатели salmon172 Паскаль, Turbo Pascal, PascalABC.NET 0 31.05.2011 21:34
указатели Артэс Общие вопросы C/C++ 4 07.09.2010 11:08
Указатели Анютик_sexi Помощь студентам 3 16.06.2010 14:38
Указатели AquaticSoul Общие вопросы C/C++ 5 22.12.2009 15:13
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39