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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
18.04.2012, 21:17     Работа с файловым потоком #1
Всем привет. После того как я познакомился с понятием поток приступил к практической части. В процессе возникло несколько скользких моментов о которых я хотел спросить у знающих людей.
1) Я хочу создать в классе потоковый класс что бы не париться по поводу каждого раза отрывать и закрывать поток. Вопрос почему Лафоре говорить что паток должен быть обязательно статическим, более того почему открыть поток получается только с помощью статического метода, а не при помощи конструктора?
Да и почему такая казалось бы альтернатива тоже не катит?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class a
{
  static fstream file;
public:
  a();
 static void openfile();
 
};
fstream a::file;
 
a()
{openfile();}
void openfile()
{
 file.open("data.dat",ios::in|ios::out|ios::app|ios::binary);
}
Добавлено через 1 час 22 минуты
up!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2012, 21:17     Работа с файловым потоком
Посмотрите здесь:

работа с файловым потоком!!! C++
C++ задача с файловым потоком
работа с файловым типом((( C++
C++ работа с потоком
Обработка одномерных массивов с файловым вводом выводом C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ProNoooob
71 / 71 / 6
Регистрация: 14.10.2009
Сообщений: 121
18.04.2012, 21:56     Работа с файловым потоком #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <fstream>
 
using namespace std;
 
class a
{
public:
    a();
private:
    fstream file;
};
 
a::a() : file()
{
    file.open("data.dat", ios::in|ios::out|ios::app|ios::binary);
}
 
int main()
{
    a A;
 
    return 0;
}
Должно работать. Не вижу проблем.
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
19.04.2012, 10:44  [ТС]     Работа с файловым потоком #3
Да я согласен поблем нет сам лично пробовал возможные комбинаци.

Тогда очень прошу подсказать мне почему в ниже приведенном коде, поток как то странно работает. А точнее он для любого первого метода открыт и работает нормально , но зато любой другой метод который обращается к потоку втарым не видит того что поток открыт и просто ни чего не произходит, ни запись или чтение. Даходит даже да обсурдного два раза подряд вызвать метод показать базу данных и на второй раз поток почемуто не выводиться хотя я слежу за файловым указателем. Кому не лень просмотреть этот код пожалуйста подскажите в чем моя ошибка, я уже второй день как об стену лбом.
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 минуту
Прошу прощения за величену кода. Просто я не знаю в чем ошибка и в простом примере повторить её не удалось! По этому выложил код орегинал.
-=ЮрА=-
Заблокирован
Автор FAQ
19.04.2012, 12:20     Работа с файловым потоком #4
stawerfar, чуть позже сделаю(сегодня), проблеммы вообще нет.
Сделай private член ifstream ifs а доступ к файлу осуществляй допустим в методе
Open(char * szPath) через ifs.open(szPath)

Добавлено через 1 минуту
Цитата Сообщение от stawerfar Посмотреть сообщение
поток получается только с помощью статического метода, а не при помощи конструктора?
- подожди я вчитался

Добавлено через 47 секунд
Ну можно и через конструктор только по указателю надо работать, накидаю и такой вариант, но сейчас реально нет времени, отпишусь часа через 2
-=ЮрА=-
Заблокирован
Автор FAQ
19.04.2012, 13:58     Работа с файловым потоком #5
stawerfar, вот что вышло.CFirstStringReader класс для считывания 1-й строки файла.
Класс снабжён 3-мя конструкторами (в конструктор преобразования передаём именно указатель на файловый поток). Класс снабжён методом Open о котором говорил выше
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Open(char * szPath) через ifs.open(szPath)
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
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
class CFirstStringReader
{
private:
    ifstream ifs;
    string   line;
public:
    CFirstStringReader(){cout<<"CALLED DEFAULT CONSTRUCTOR\n";};
    CFirstStringReader(ifstream * ps)
    {
        cout<<"CALLED TRANSFORM CONSTRUCTOR\n";
        Close();
        Copy(ps);
    }
    CFirstStringReader(CFirstStringReader *obj)
    {
        cout<<"CALLED COPY CONSTRUCTOR\n";
        Close();
        Copy(&obj->ifs);
    }
    ~CFirstStringReader()
    {
        Close();
    }
    void Close();
    void Copy(ifstream * ps);
    bool Open(string szPath);
    string getFirstString();
};
 
void CFirstStringReader::Close()
{
    if(ifs)
        ifs.close();
}
 
void CFirstStringReader::Copy(ifstream * ps)
{
    Close();
    ifs = (*ps);
}
 
bool CFirstStringReader::Open(string szPath)
{
    bool bRet = true;
    ifs.open(szPath.c_str());
    if(!ifs)
        bRet = false;
    return bRet;
}
 
string CFirstStringReader::getFirstString()
{
    if(ifs)
    {
        ifs.clear();
        ifs.seekg(0,ios::beg);
        getline(ifs,line);
    }
    return line;
}
 
int main()
{
    CFirstStringReader obj1;
    obj1.Open("test1.txt");
    ifstream ifs("test2.txt");
    cout<<obj1.getFirstString()<<endl;
    CFirstStringReader obj2(&ifs);
    cout<<obj2.getFirstString()<<endl;
    CFirstStringReader obj3(&obj1);
    cout<<obj3.getFirstString()<<endl;
    system("pause");
    return 0;
}
Содержимое файлов
test1.txt Data in test1
test2.txt Data in test2
Миниатюры
Работа с файловым потоком  
-=ЮрА=-
19.04.2012, 14:03
  #6

Не по теме:

PS

Цитата Сообщение от stawerfar Посмотреть сообщение
std::
- почитай здесь об этом
http://www.cyberforum.ru/blogs/34326/blog275.html

stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
19.04.2012, 14:18  [ТС]     Работа с файловым потоком #7
Большое спасибо! Может я чего то не понял, и поэтому спрошу. В твоем примере ты постоянно следишь для каждого метода открыт поток или нет.(Я так же сделал для того что бы выйти из этой сложившейся ситуации).
Существует ли возможность того что бы это делать один раз с помощью конструктора без аргументов и диструктора.
Ну например есть класс, с ним связаны статическое поле fstream file. Мы его в конструкторе открыли, по окончанию работы закрыли диструктором.
Я пробовал так делать в маленьких примерах и это работает, но почему то в моем примере кода один метод класса понимает что поток открыт а другой нет, или еще хуже один и тот же метод второй раз не понимает что поток открыт.
Может подскажете где по подробней об этом почитать и почему так происходит?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.04.2012, 14:19     Работа с файловым потоком #8
-=ЮрА=-, Зачем на stream использовать указатели-то? Есть ведь ссылки.
На тему поста в твоем блоге, ну если ты не пишешь большие проекты на плюсах (не для себя, а продакшн код) - можешь продолжать так думать, а когда пишешь продакшн код и namespace далеко не один и видишь using namespace std/boost в глобальной видимости, хочется оторвать руки.
-=ЮрА=-
Заблокирован
Автор FAQ
19.04.2012, 14:31     Работа с файловым потоком #9
Цитата Сообщение от stawerfar Посмотреть сообщение
Существует ли возможность того что бы это делать один раз с помощью конструктора без аргументов и диструктора.
- конечно существует
CFirstStringReader obj1;
obj1.Open("test1.txt");
Всё до конца main мы работаем с файлом test1.txt, как видишь потоки я и закрываю в деструкторе. Хочешь открыть поток а потом только с ним работать, вот тогда так
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ifstream ifs("test2.txt");
* * CFirstStringReader obj2(&ifs);
* * cout<<obj2.getFirstString()<<endl;
Я тебе дал 3 варианта как открыть поток и работать с ним до конца программы, а далее выбор за тобой

Добавлено через 6 минут

Не по теме:

ForEveR, не хочу отвечать т.к. ты абсолютно не знаешь где работаю, что пишу и где это применяется. Выйми руки из одного места, тогда и проблемм с std:: не будет. Если есть давай пример неразрешимой проблеммы с нэймспейсом, думаю после того как выпью чайку, решу её минут за пять с одновременным почитыванием новостей в гугле

ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.04.2012, 14:59     Работа с файловым потоком #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <thread>
#include <boost/thread.hpp>
 
using namespace boost;
using namespace std;
 
int main()
{
   thread thr;
}
Решай. Без убирания using namespace. И без явной специализации namepsace перед thread. Ну и конечно же без using.
-=ЮрА=-
19.04.2012, 15:29
  #11

Не по теме:

ForEveR, я не работаю с бустом, с которым работаешь для линукса.
По поводу твоей задачи от diagon я уже ответил в своём блоге http://www.cyberforum.ru/blogs/34326...ml#comment1769
Холиворить не хочу т.к. я предпочитаю API MFC и Windows, консольным поделкам в линуксе.

stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
19.04.2012, 16:06  [ТС]     Работа с файловым потоком #12
Всем спасибо. Особенно Юре.
Я многое узнал, намного больше чем был мой вопрос. Может я так объяснял,может меня просто по своему поняли....
Но в итоге я разобрался, вчем проблема, почему один и тот же метод на второй раз не работал с потоком.
Мне ни кто ни сказал да я и не знал, современем допетрил что поток после того как он конца достигает сбрасывать нужно. Вот и вся проблема.
Всем спасибо!
-=ЮрА=-
Заблокирован
Автор FAQ
19.04.2012, 16:33     Работа с файловым потоком #13
Цитата Сообщение от stawerfar Посмотреть сообщение
современем допетрил что поток после того как он конца достигает сбрасывать нужно.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(ifs)
* * {
* * * * ifs.clear();
ifs.seekg(0,ios::beg);
флаги ошибок нужно обнулять и внутри методов(вообще сброс флагов лучше производить перед каждой операцией чтения/записи в поток), а сам поток переводить вначало если хотим читать заново.
ifs.clear() - сброс флагов ошибок
ifs.seekg(0,ios::beg) - возврат курсора вначало потока
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
19.04.2012, 16:41  [ТС]     Работа с файловым потоком #14
Человеческий мозг всё-таки удивительная штука, доказано любую проблему решает от 2 до 5 секунд, а остальное время объясняет сознанию решение задачи!
Так вот и я, ты мне написал правильное решение, я это увидел но не осознал что это и есть решение моей проблемы. Спустя время мысль якобы сома пришла!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2012, 16:56     Работа с файловым потоком
Еще ссылки по теме:

C++ Переворот рисунка потоком
C++ Работа с потоком изменить кодировку
Работа с потоком (управление, защита) C++

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
19.04.2012, 16:56     Работа с файловым потоком
  #15

Не по теме:

Цитата Сообщение от stawerfar Посмотреть сообщение
доказано любую проблему решает от 2 до 5 секунд
- согласен абсолютно. Любой проект в мозгу прокручивается почти сразу или идея появляется, а далее лишь реализация идёт. Где то читал что тактовая частота импульсов в нашем мозге что то около 32 кГц, получается 32 тыс операции в секунду, т.е. выходит 5*32 = 160 тыс операций и мы получаем теорию относительности, либо какие сухарики взять к пиву(Вот и многослойная нейронная сеть, вроди бы тактовая частота 32 кГц, а наварганить можем дай бог )

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

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