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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2010, 16:54   #1
pobedin
Форумчанин
 
Регистрация: 30.07.2009
Сообщений: 105
По умолчанию Чтение из файла... ошибка

Здравствуйте. Есть такой код.
Код:
#include <iostream.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>
void main(void)
{
   FILE *fp;
   union u
   {
        double a,b,s,r;
   } krug, pryamoug;
   int men=0;
   const pi=3.14;
   // menu
   cout<<"Menu: "<<endl;
   cout<<"1 - Vys4itat' <S> kruga"<<endl;
   cout<<"2 - Vys4itat' <S> pryamougol'nika"<<endl;
   cout<<"3 - Vyvesti sohranennye dannye na ekran"<<endl;
   cout<<"0 - Exit"<<endl<<endl;
   cout<<"Vyberite punkt menyu... "<<endl;
   cin>> men;
   switch (men)
   {
     case 1:
     {
        fp = fopen ("file.txt", "w++");
        cout<<endl<<"Vvedite radius kruga R="<<endl;
        cin>>krug.r;
        krug.s=(2*pi)*(pow(krug.r,2));
        cout<<"S kruga= "<<krug.s<<endl;
        fprintf(fp,"S kruga= %5.1lf\n",krug.s);
        break;
     }
     case 0:
     {
        exit(0);
        break;
     }
     case 2:
     {
        fp = fopen ("file.txt", "w++");
        cout<<"Vvedite storony pryamougol'nika A i B"<<endl;
        cout<<"A= ";
        cin>>pryamoug.a;
        cout<<"B= ";
        cin>>pryamoug.b;
        pryamoug.s=(pryamoug.a+pryamoug.b)*2;
        cout<<"S pramyaugol'nika= "<<pryamoug.s<<endl;
        fprintf(fp,"S pryamougol'nika= %5.1lf\n",pryamoug.s);
     }
     case 3:
     {
        fp = fopen ("file.txt", "r++");
        char string[50],*rezult;
        rezult=fgets(string, 50, fp);
        cout<<rezult;
     }
   }
   fclose(fp);
   cout<<endl<<"Press any key..."<<endl;
   getch();
}
ругается на строке "cout<<rezult;". Ошибка памяти. Что не так делаю?

Последний раз редактировалось pobedin; 22.12.2010 в 17:13.
pobedin вне форума Ответить с цитированием
Старый 22.12.2010, 17:06   #2
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

ты файл на запись открыл и не закрыл а открываешь на чтение, возможно он не открывается даже а ты его читат ьпытаешся.
ЗЫ: ты знаешь что такое union?
UltimaBeaR вне форума Ответить с цитированием
Старый 22.12.2010, 17:12   #3
pobedin
Форумчанин
 
Регистрация: 30.07.2009
Сообщений: 105
По умолчанию

На запись все ок работает, но исправил, все равно ошибка остается той же. Может быть поток нельзя так явно выводить на экран.
А что не так с union?

Последний раз редактировалось pobedin; 22.12.2010 в 17:16.
pobedin вне форума Ответить с цитированием
Старый 22.12.2010, 17:25   #4
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

проверь открывается ли файл вобще после fp = fopen ("file.txt", "r++");
надо под отладчиком посмотреть откуда ошибка.
а union - он хранит данные в одних и тех же адресах памяти, тоесть в твоем случае при записи например pryamoug.a = 5; в pryamoug.b тоже будет 5. тебе наверно надо не union а struct
UltimaBeaR вне форума Ответить с цитированием
Старый 22.12.2010, 17:39   #5
pobedin
Форумчанин
 
Регистрация: 30.07.2009
Сообщений: 105
По умолчанию

я знаю, что он так хранит. мне по условию нужно выполнить именно через объединение. а в нем хранить данные 2 фигур: прямоугольника и круга, а на выбор считать их площадь и писать ее в файле. я не понимаю зачем здесь объединение, но не поспоришь. файл нормально открывается. ошибка если "cout<<rezult" делаю. может как по-другому можно считать данные из txt?!

Последний раз редактировалось pobedin; 22.12.2010 в 17:44.
pobedin вне форума Ответить с цитированием
Старый 22.12.2010, 17:48   #6
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

Код:
...

     case 3:
     {
        fp = fopen ("file.txt", "r++");
        if (fp != NULL)
        {
            char string[50],*rezult;
            rezult=fgets(string, 50, fp);
            cout<<rezult;
        }
        else
            cout << "fopen failed" << "\n";
     }

...
ЗЫ: скорее всего тебе нужно внутри union сделать 2 структуры 1у для прямоугольника вторую для круга.

cout<<"A= ";
cin>>pryamoug.a;
cout<<"B= ";
cin>>pryamoug.b;

допустим юзер ввел A=5, B=7
так вот после отработки этого кода у тебя будет
pryamoug.a == 7
pryamoug.b == 7

Последний раз редактировалось UltimaBeaR; 22.12.2010 в 17:52.
UltimaBeaR вне форума Ответить с цитированием
Старый 22.12.2010, 17:56   #7
pobedin
Форумчанин
 
Регистрация: 30.07.2009
Сообщений: 105
По умолчанию

все заработало. только я не понял, что изменилось кроме проверки условия? о_О
з.ы. понял ошибку. спасибо. исправлю. а что мне даст 2 структуры в юнионе в сравнении с просто 2-мя структурами?

Последний раз редактировалось pobedin; 22.12.2010 в 18:06.
pobedin вне форума Ответить с цитированием
Старый 22.12.2010, 18:18   #8
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

должно не заработать а вылезти должно сообщение об ошибке открытия файла, если дело в этом. у тебя данные одной фигуры не должны быть в 1ом и томже адресе памяти, память должна делится между данными 2х типов фигур, а у тебя память делится между 4мя переменными.

тебе чтото типо этого надо
Код:
struct Figure
{
    union
    {
        int circleRadius;
        struct
        {
            int width;
            int height;
        } rectangle;
    } figuresData;
    int calcucatedSquare;
} circle, rectangle;
и дальше используешь

circle.figuresData.circleRadius
circle.calcucatedSquare

rectangle.figuresData.rectangle.wid th
rectangle.figuresData.rectangle.hei ght
rectangle.calcucatedSquare
UltimaBeaR вне форума Ответить с цитированием
Старый 22.12.2010, 19:31   #9
pobedin
Форумчанин
 
Регистрация: 30.07.2009
Сообщений: 105
По умолчанию

должно вылезть сообщение, но вместо этого информация из текстового файла выводится на экран :
не понял причины, но спасибо за помощь
pobedin вне форума Ответить с цитированием
Старый 22.12.2010, 20:35   #10
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

Ну значит ты чтото сам исправил еще где-то и не заметил)))
UltimaBeaR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение из файла С++ Michahodrev Помощь студентам 2 18.12.2010 23:47
Чтение из файла virtuhay266 Помощь студентам 0 27.11.2010 23:27
чтение из файла dedokk1234 Общие вопросы C/C++ 0 15.06.2009 19:10
Чтение из файла pautina Общие вопросы Delphi 8 23.01.2009 15:48
чтение из файла Илья500 Общие вопросы C/C++ 26 05.12.2008 00:37