Форум программистов, компьютерный форум CyberForum.ru

Работа с файлом - C++

Восстановить пароль Регистрация
 
Layzie
0 / 0 / 0
Регистрация: 28.12.2013
Сообщений: 87
02.03.2014, 22:07     Работа с файлом #1
в общем есть некая решенная задача которая имеет классы и методы(ввода и вывода) для них, нужно ювелирно переделать методы так чтоб они вводили/выводили не на/с экран(а) а в/из файл(а) где то видел изящное решение когда подавали вроде бы файловую переменную как параметр на эти функции но у меня так не получилось =\ подскажите как это будет проще, вот код программы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include "stdafx.h"
#include "math.h"
#include <iostream>
using namespace std;
 
class pset
    {public:
    float x,y,z;
    void input();
    void output();
//  float smeshproiz(pset a,pset b, pset c);
    };
float SP(pset a,pset b, pset c) //смешанное произведение чтобы проверять являются ли введенные данные вершинами параллелограмма
    {pset d;
    d.x=b.y*c.z-b.z*c.y;
    d.y=b.z*c.x-b.x*c.z;
    d.z=b.x*c.y-b.y*c.x;
    return d.x*a.x+d.y*a.y+d.z*a.z;
    }
class paral
    {public:
    pset A1,B1,C1,D1,A2,B2,C2,D2;
    float kx,ky,kz;
    void input();
    void output();
    float diag();
    };
void pset::input()
    {cout<<"x=";
    cin>>x;
    cout<<"y=";
    cin>>y;
    cout<<"z=";
    cin>>z;
    }
void paral::input()
    {cout<<"\nvvedite A1: \n";
    A1.input();
    cout<<"\nvvedite B1: \n";
    B1.input();
    cout<<"\nvvedite C1: \n";
    C1.input();
    cout<<"\nvvedite D1: \n";
    D1.input();
    pset ab,ac,ad;
    ab.x=B1.x-A1.x;
    ab.y=B1.y-A1.y;
    ab.z=B1.z-A1.z;
    ac.x=C1.x-A1.x;
    ac.y=C1.y-A1.y;
    ac.z=C1.z-A1.z;
    ad.x=D1.x-A1.x;
    ad.y=D1.y-A1.y;
    ad.z=D1.z-A1.z;
    while(SP(ab,ac,ad)!=0)
        {cout<<"\nnevernie dannie";
        cout<<"\nvvedite A1: \n";
        A1.input();
        cout<<"\nvvedite B1: \n";
        B1.input();
        cout<<"\nvvedite C1: \n";
        C1.input();
        cout<<"\nvvedite D1: \n";
        D1.input();
        ab.x=B1.x-A1.x;
        ab.y=B1.y-A1.y;
        ab.z=B1.z-A1.z;
        ac.x=C1.x-A1.x;
        ac.y=C1.y-A1.y;
        ac.z=C1.z-A1.z;
        ad.x=D1.x-A1.x;
        ad.y=D1.y-A1.y;
        ad.z=D1.z-A1.z;
        }
    cout<<"\nvvedite A2: \n";
    A1.input();
    cout<<"\nvvedite B2: \n";
    B1.input();
    cout<<"\nvvedite C2: \n";
    C1.input();
    cout<<"\nvvedite D2: \n";
    D1.input();
    ab.x=B2.x-A2.x;
    ab.y=B2.y-A2.y;
    ab.z=B2.z-A2.z;
    ac.x=C2.x-A2.x;
    ac.y=C2.y-A2.y;
    ac.z=C2.z-A2.z;
    ad.x=D2.x-A2.x;
    ad.y=D2.y-A2.y;
    ad.z=D2.z-A2.z;
        while(SP(ab,ac,ad)!=0)
            {   cout<<"\nvvedite A2: \n";
            A1.input();
            cout<<"\nvvedite B2: \n";
            B1.input();
            cout<<"\nvvedite C2: \n";
            C1.input();
            cout<<"\nvvedite D2: \n";
            D1.input();
            pset ab,ac,ad;
            ab.x=B2.x-A2.x;
            ab.y=B2.y-A2.y;
            ab.z=B2.z-A2.z;
            ac.x=C2.x-A2.x;
            ac.y=C2.y-A2.y;
            ac.z=C2.z-A2.z;
            ad.x=D2.x-A2.x;
            ad.y=D2.y-A2.y;
            ad.z=D2.z-A2.z;
            }
 
    }
void pset::output()
    {
    cout<<"("<<x<<","<<y<<","<<z<<")";
    }
void paral::output()
    {   cout<<"A1=";
    A1.output();
    cout<<"\n";
    cout<<"B1=";
    B1.output();
    cout<<"\n";
    cout<<"C1=";
    C1.output();
    cout<<"\n";
    cout<<"D1=";
    D1.output();
    cout<<"\n";
    cout<<"A2=";
    A2.output();
    cout<<"\n";
    cout<<"B2=";
    B2.output();
    cout<<"\n";
    cout<<"C2=";
    C2.output();
    cout<<"\n";
    cout<<"D2=";
    D2.output();
    cout<<"\n";
    }
float paral::diag()
    {return sqrt((A2.x-C1.x)*(A2.x-C1.x)+(A2.y-C1.y)*(A2.y-C1.y)+(A2.z-C1.z)*(A2.z-C1.z));
    }
 
int _tmain(int argc, _TCHAR* argv[])
{   //vvod
    int n;
    cout<<"vvedite kolichestvo parallelepipedov";
    cin>>n;
    paral* A;
    A=new paral[n];
    for(int i=0;i<n;i++)
        {cout<<"vvedite parallelepiped"<<i+1<<":";
        A[i].input();
        }
    //sortirovka 
    for(int i=0; i<n; ++i)
        for(int j=i+1; j<n; ++j)
            if(A[j].diag()<A[i].diag()) swap(A[i],A[j]); 
    //vivod
    for(int i=0;i<n;i++)
        {cout<<"parallelepiped "<<i+1<<":\n";
        A[i].output();
        cout<<"ego diagonal: "<<A[i].diag()<<"\n";
        }
    return 0;
}
P.S. если возможно то желательно работать не с потоками а с обычными функциями типа fputs fgets
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.03.2014, 22:07     Работа с файлом
Посмотрите здесь:

C++ Работа с файлом
работа с файлом C++
Работа с файлом C++
C++ c++ работа с файлом
C++ работа с файлом
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.03.2014, 22:42     Работа с файлом #2
Цитата Сообщение от Layzie Посмотреть сообщение
когда подавали вроде бы файловую переменную как параметр на эти функции
Это сделать можно(передаётся ссылка на поток), но дело в том, что у вас в файл будет много лишнего записываться, что потом не будет обработано при чтении. Например:
C++
1
2
3
4
void pset::output(ostream& out)
{
       out<<"("<<x<<","<<y<<","<<z<<")";
}
Эти запятые, при выводе на консоль, никак не мешают, но если читать содержимое файла, так записанное, этим кодом:
C++
1
2
3
4
5
6
7
8
9
void pset::input(istream& in)
{
    cout<<"x=";
    in>>x;
    cout<<"y=";
    in>>y;
    cout<<"z=";
    in>>z;
}
, то эти запятые уже будут ломать поток.
Layzie
0 / 0 / 0
Регистрация: 28.12.2013
Сообщений: 87
02.03.2014, 22:49  [ТС]     Работа с файлом #3
для считывания мне все равно придется распознавание координат из текста писать потому что по условию данные в файле из которого считывать лежат как раз в формате со скобочками и запятыми, можете рассказать по подробней тогда как сделать ввод вывод с помощью потоков?
kiborgdelto
70 / 72 / 27
Регистрация: 23.03.2011
Сообщений: 141
02.03.2014, 22:52     Работа с файлом #4
Цитата Сообщение от alsav22 Посмотреть сообщение
то эти запятые уже будут ломать поток.
в данном случае можно попробовать удалить лишние символы из потока

C++
1
2
3
4
5
6
7
8
9
10
void pset::input(istream& in)
{
    in.ignore(1);
    in>>x;
    in.ignore(1);
    in>>y;
    in.ignore(1);
    in>>z;
    in.ignore(1);
}
P.S. зачем выводить бессмысленные сообщения о вводе значения переменной если мы читаем из файла? в результате мы просто при чтении выведем на экран x=y=z=
Layzie
0 / 0 / 0
Регистрация: 28.12.2013
Сообщений: 87
02.03.2014, 22:58  [ТС]     Работа с файлом #5
не знаю, просто так привык

Добавлено через 2 минуты
Цитата Сообщение от kiborgdelto Посмотреть сообщение
в данном случае можно попробовать удалить лишние символы из потока

C++
1
2
3
4
5
6
7
8
9
10
void pset::input(istream& in)
{
    in.ignore(1);
    in>>x;
    in.ignore(1);
    in>>y;
    in.ignore(1);
    in>>z;
    in.ignore(1);
}
P.S. зачем выводить бессмысленные сообщения о вводе значения переменной если мы читаем из файла? в результате мы просто при чтении выведем на экран x=y=z=
а если я буду просто писать так
C++
1
in>>x
разве я смогу в качестве данных вводить дробные и отрицательные числа, просто раньше я писал разбор строки в ручную с помощью while'a, а про потоки ничего не знаю.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.03.2014, 23:04     Работа с файлом #6
Код я особо не изучал, что там и куда пишется, но, например, если кроме чисел в файле присутствуют другие символы (запятые, скобки), то их, перед чтением чисел, нужно извлекать. Как-то так (в файле: (x,y,z)):

C++
1
2
3
4
5
6
7
8
9
10
void pset::input(istream& in)
{
    in.get();
    in>>x;
    in.get();
    in>>y;
    in.get();
    in>>z;
    in.get();
}
Добавлено через 3 минуты
Цитата Сообщение от Layzie Посмотреть сообщение
а если я буду просто писать так:
C++
1
in>>x;
разве я смогу в качестве данных вводить дробные и отрицательные числа
Если x - это float или double, то почему нет?

Добавлено через 54 секунды
Разделять числа в файле пробельными символами.
kiborgdelto
70 / 72 / 27
Регистрация: 23.03.2011
Сообщений: 141
02.03.2014, 23:14     Работа с файлом #7
если число записано подряд(т.е. без пробелов) то оно прочитается и неважно какого оно типа целое или дробное, при этом читаться будет до 1-го пробела либо другого символа не относящегося к числу, если этот символ не пробел (или интер, хотя с интером не всё так гладко, в некоторых случаях его нужно считывать отдельно) то его нужно либо удалить из потока либо считать и сразу забыть чтобы непроизошло несоответстиве типов, как это сделать было приведено выше
Layzie
0 / 0 / 0
Регистрация: 28.12.2013
Сообщений: 87
02.03.2014, 23:17  [ТС]     Работа с файлом #8
спасибо)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2014, 23:25     Работа с файлом
Еще ссылки по теме:

C++ Работа с файлом
Работа с файлом C++
Работа с файлом C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
02.03.2014, 23:25     Работа с файлом
  #9

Не по теме:

Цитата Сообщение от Layzie Посмотреть сообщение
спасибо)
Спасибо и вам...

Yandex
Объявления
02.03.2014, 23:25     Работа с файлом
Ответ Создать тему
Опции темы

Текущее время: 03:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru