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

Работа с файловым потоком - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Шаблонный стек http://www.cyberforum.ru/cpp-beginners/thread552042.html
Не понимаю, почему возникает ошибка, когда возвращаю значения из функции Pop (). выражение слева от ".x" должно представлять класс, структуру или объединение - вот такое выдает, хотя у меня переменная слева представляет структуру #include <iostream> using namespace std; template <class T> class Stack {
C++ Возможно в С++ написать команду, которая бы запускала указанную программу? Возможно в С++ написать команду, которая бы запускала указанную программу? что-то вроде: выполнить("C:/path/to/programm/filename.exe"); http://www.cyberforum.ru/cpp-beginners/thread552041.html
Массивы: выбрать элементы меньше нуля и отсортировать их по убыванию C++
В массиве с 5 чисел найти элементы меньше нуля и отсортировать их по убыванию
C++ Вылетает программа
Почему программа вылетает после ввода размерностей:(Исправьте пожалуйста #include <cstdlib> #include <iostream> #include <time.h> #include <cmath> using namespace std; //Инициализация массива void arrInit(int* arr, int size){
C++ Литература по GLUT http://www.cyberforum.ru/cpp-beginners/thread552006.html
Доброго времени суток! Кто-нибудь может посоветовать литературу по OpenGL и/или GLUT (справочники тоже будут очень полезны). Заранее спасибо.
C++ Изменение формата данных && работа с файлом Вечер добрый, форумчане! Вопрос следующий: каким образом данные, считанные из файла (они, я так понимаю, в текстовом формате) преобразовать в целочисленные/числа с плавающей точкой)? Использую <fstream>. подробнее

Показать сообщение отдельно
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
19.04.2012, 10:44  [ТС]     Работа с файловым потоком
Да я согласен поблем нет сам лично пробовал возможные комбинаци.

Тогда очень прошу подсказать мне почему в ниже приведенном коде, поток как то странно работает. А точнее он для любого первого метода открыт и работает нормально , но зато любой другой метод который обращается к потоку втарым не видит того что поток открыт и просто ни чего не произходит, ни запись или чтение. Даходит даже да обсурдного два раза подряд вызвать метод показать базу данных и на второй раз поток почемуто не выводиться хотя я слежу за файловым указателем. Кому не лень просмотреть этот код пожалуйста подскажите в чем моя ошибка, я уже второй день как об стену лбом.
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
#include<iostream>
#include<fstream>
#include<string>
#include<iomanip>
#include<sstream>
//----------------------------------------------------------------------------------------------------------------------------------------------
class name
{
    private:
            static std::fstream fstrfile;//поток для работы с дисковым файлом
            std::string strname;//имя
            std::string strlastname;//фамилия
            std::string strfathername;//отчество
            unsigned int uinumber;//номер сотрудника
            //получение данных о сотруднике с проверкой
            void getsomedata(const char* const, unsigned int&,std::string* =0);
            //проверка номера сотрудника на оригинальность
            int cheaknumber(const int& const);
            //проверка сотрудника на орегинальность
            int cheakemployee(const char* const cchcname, const char* const cchcfathername, const char* const cchclastname);
            //записать данные на диск
            void write(void);
            //считать данные с диска
            void read(void);
            //сброс файлового указателя
            static void resetfilept(void);
    public:
            //конструктор без параметров
            name(void);
            //конструктор с четырьмя параметрами
            name(const char* const cchcname, const char* const cchcfathername, const char* const cchclastname, unsigned int uinumber);
            //диструктор
            ~name(void);
            //получить данные
            void getdata(void);
            //вывести данные на экран консоли
            void putdataconsolas(void);     
            //открыть поток
            static void openfile(void);
};
std::fstream name::fstrfile;
//----------------------------------------------------------------------------------------------------------------------------------------------
 
//конструктор без параметров
name::name(void):uinumber(0)
{
    openfile();//открыть файловый поток
    setlocale(LC_ALL,"Russian_Russia.1251");//разрешаю вывод русского языка
}
 
//конструктор с четырьмя параметрами
name::name(const char* const cchcname, const char* const cchcfathername, const char* const cchclastname, unsigned int uinumber)
{
    //инициализация полей класса
    strname = cchcname;
    strlastname = cchclastname;
    strfathername = cchcfathername;
    name::uinumber = uinumber;
    openfile();//открыть файловый поток
    setlocale(LC_ALL,"Russian_Russia.1251");//разрешаю вывод русского языка 
}
 
//диструктор
name::~name(void)
{fstrfile.close();}
 
//сброс файлового указателя
void name:: resetfilept(void)
{
    fstrfile.seekg(0);
} 
 
//получить данные
void name::getdata(void)
{
    SYSTEMPCHRSH:
    //получить номер сотруднка
    getsomedata("Введите номер сотрудника :",uinumber);
    while(true)
    {
        std::string strtemp;
        //получить номер сотрудника как объект string
        std::stringstream ss;
        ss<<uinumber;
        //получить имя сотрудника
        strtemp = "Введите имя сотрудника №" + ss.str();
        getsomedata(strtemp.c_str(),uinumber,&strname);
        //получить фамилию сотрудника
        strtemp = "Введите фамилию сотрудника №" + ss.str();
        getsomedata(strtemp.c_str(),uinumber,&strlastname);
        //получить отчество сотрудника
        strtemp = "Введите отчество сотрудника №" + ss.str();
        getsomedata(strtemp.c_str(),uinumber,&strfathername);
        //проверка на орегинальность сотрудника
        if(!cheakemployee(strname.c_str(),strfathername.c_str(),strlastname.c_str()))
        {break;}
        char chtemp;//для ответа пользователя
        while(true)
        {
            std::cout<<"Для продолжения ввода нажмите (y) :";
            std::cin.unsetf(std::ios::skipws);
            std::cin>>chtemp;
            if(std::cin.good())
            {
                std::cin.ignore(100,'\n');
                if(chtemp=='y')
                {goto SYSTEMPCHRSH;}
                 break;
            }
            std::cin.clear();
            std::cin.ignore(100,'\n');
            std::cerr<<"Ошибка. Введено не допустимое значение"<<std::endl;
        }
        if(chtemp!='y')
        {//если пользователь решил прекратить ввод то обнуляем все значения и выходим из метода
            uinumber=0;
            strname ="";
            strlastname="";
            strfathername="";
            return;
        }
    }
    write();//записать данные в базу данных
}
 
//открыть поток
void name::openfile(void)
{
    //открыть файл для дальнейшей работы с ним
    fstrfile.open("database.txt",std::ios::in|std::ios::out|std::ios::app|std::ios::binary);
}
//получение данных о сотруднике с проверкой
void name:: getsomedata(const char* const cchcmesg, unsigned int& uinum,std::string* strval)
{
    //получение данных от пользователя с проверкой
    while(true)
    {
        std::cout<<cchcmesg<<' ';
        std::cin.unsetf(std::ios::skipws);//не игнорировать пробелы
        if(strval==0)
        {std::cin>>uinumber;}
        else
        {std::cin>>*strval;}
        if(std::cin.good())
        {
            std::cin.ignore(100,'\n');//удалить лишние символы из потока
            //проверка номера сотрудника на оригинальность
            if(strval==0)
            if(cheaknumber(uinumber))//если такой номер уже используется то начать цикл заного
            {continue;} 
            break;
        }
        std::cin.clear();//очистить биты ошибок
        std::cin.ignore(100,'\n');
        std::cout<<"Ошибка. Введено не коректное значение"<<std::endl;
    }
}
 
//проверка сотрудника на орегинальность
int name::cheakemployee(const char* const cchcname, const char* const cchcfathername, const char* const cchclastname)
{
     
    unsigned int uisize=0;//номер сотрудника
    //имя, фамилия, отчество
    std::string name,lastname,fathername;       
    resetfilept();//вернуть на начало файловый указатель
 
        while(!fstrfile.eof())//продолжать пока не достигнем конца файла
        {
            fstrfile>>uisize>>name>>lastname>>fathername;
            if(cchcname==name&&cchcfathername==fathername&&cchclastname==lastname)
            {
                std::cerr<<"Данный сотрудник есть в базе данных под номером №"<<uisize<<std::endl;
                return 1;
            }
        }
    return 0;
}
 
//вывести данные на экран консоли
void name:: putdataconsolas(void)
{
    fstrfile.seekg(std::ios::end,0);
    if(!fstrfile.tellg())//если база пуста то выход
    {std::cerr<<"В базе данных не ни одной записи!"<<std::endl;return;}
    std::cout<<'|'<<std::setw(78)<<std::setfill('*')<<'|'<<std::endl;
    std::cout<<'|'<<std::setw(60)<<std::setfill(' ')<<"Производиться чтение базы данных..."<<std::setw(18)<<'|'<<std::endl;
    std::cout<<'|'<<std::setw(78)<<std::setfill('*')<<'|'<<std::endl;
    resetfilept();//сброс файлового указателя
    read();//прочитать данные из класса
    while(!fstrfile.eof())
    {
    
        std::cout<<"Сотрудник №"<<uinumber<<std::endl
                 <<"Имя :"<<strname<<std::endl
                 <<"Фамилия :"<<strlastname<<std::endl
                 <<"Отчество :"<<strfathername
                 <<std::endl;
        read();//прочитать данные из класса
 
    }
}
//записать данные на диск
void name:: write(void)
{
    fstrfile<<uinumber<<std::endl
            <<strname.c_str()<<std::endl
            <<strlastname.c_str()<<std::endl
            <<strfathername.c_str()<<std::endl;
}
//считать данные с диска
void name:: read(void)
{
    fstrfile>>uinumber>>strname>>strlastname>>strfathername;
}
 
//проверка номера сотрудника на оригинальность
int name:: cheaknumber(const int& const cicnum)
{
    unsigned int uisize =0;
    //имя, фамилия, отчество
    std::string name,lastname,fathername;
    resetfilept();//вернуть на начало
 
        while(!fstrfile.eof())//продолжать пока не достигнем конца файла
        {
            fstrfile>>uisize>>name>>lastname>>fathername;
            if(cicnum == uisize)
            {
                std::cerr<<"Ошибка.Данный табельный номер используется!"<<std::endl;
                return 1;
            }
        }
    return 0;
}
/*************************************************************************************************************************************/
int main(void)
{   
    class name val;
    setlocale(LC_ALL,"Russian_Russia.1251");
    std::string stroper/*тип операции*/,strchose="yes";//выбор пользователя об продолжении 
    while(strchose=="yes")
    {
        while(true)
        {
            std::cout<<" (new) -для ввода новых данных\n"
                     <<" (show) - для вывода всей базы на экран\n"
                     <<"Введите операцию :";
            std::cin.unsetf(std::ios::skipws);//неигнорировать  побелы
            std::cin>>stroper;
            if(std::cin.good())
            {
                std::cin.ignore(100,'\n');
                if(stroper=="new"||stroper=="show")
                {break;}
                std::cerr<<"Обибка.Недопустимая операция!"<<std::endl;
                continue;
            }
            std::cin.clear();
            std::cin.ignore(100,'\n');
            std::cerr<<"Ошибка.Введен недопустимый символ!"<<std::endl; 
        }
        //определить тип операции
        enum{new_,show}bob = stroper =="new"?new_:show;
        //анализировать тип операции
        switch(bob)
        {
            case new_:
                val.getdata();
                break;
            case show:
                val.putdataconsolas();
                break;
        }
 
        //опрос пользователя об продолжении операции
        while(true)
        {
            std::cout<<"Продолжить (yes,no) :";
            std::cin.unsetf(std::ios::skipws);//неигнорировать пробелы
            std::cin>>strchose;
            if(std::cin.good())
            {
                std::cin.ignore(100,'\n');
                if(strchose=="yes"||strchose=="no")
                {break;}
                std::cerr<<"Обибка.Недопустимая операция!"<<std::endl;
                continue;
            }
            std::cin.clear();
            std::cin.ignore(100,'\n');
            std::cerr<<"Ошибка.Введено недопустимое значение!"<<std::endl;
        }
    }
    system("pause");
return 0;
}
Добавлено через 1 минуту
Прошу прощения за величену кода. Просто я не знаю в чем ошибка и в простом примере повторить её не удалось! По этому выложил код орегинал.
 
Текущее время: 04:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru