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

Реагирование на ошибки (потоки) - C++

Восстановить пароль Регистрация
 
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
14.05.2013, 15:34     Реагирование на ошибки (потоки) #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
#include<iostream>
#include<fstream>
#include<windows.h>
 
using namespace std;
 
const int MAX = 1000;
int buff[MAX];
 
int main()
{
    for(int i = 0; i < MAX; i++)
        buff[i] = i;
 
    ofstream os("a:edata.dat");
 
    os.open("a:edata.dat", ios::trunc | ios::binary);
    if(!os)
    { cerr << "Nevozmojno otkrut' vuhodnoi fail.\n"; exit(1); }
 
    cout << "Idet zapis'...\n";
 
    os.write(reinterpret_cast<char*>(buff),MAX*sizeof(int));
 
    if(!os)
    { cerr << "Zapis' v fail nevozmojna.\n"; exit(1); }
 
    os.close();
 
    for(int j = 0 ; j < MAX ; j++)
        buff[j] = 0;
 
    ifstream is;
    is.open("a:edata", ios::binary);
 
    if(!is)
    { cerr << "Nevozmojno otkrut' fail.\n"; exit(1); }
 
      cout << "Idet chtenie...\n";
 
      is.read(reinterpret_cast<char*>(buff),MAX*sizeof(int));
      if(!os)
      {
          cout << "Nevozmojno chtenie faila.\n"; exit(1);
      }
 
      for(int j = 0 ; j < MAX; j++)
        if(buff[j]!=j)
            {
                cerr << "Dannue ne korektnu.\n;"; exit(1);
            }
 
     cout << "Dannue vporiadke\n";
     return 0;
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2013, 15:34     Реагирование на ошибки (потоки)
Посмотрите здесь:

C++ потоки
Потоки! C++
Потоки C++
C++ Потоки
C++ Потоки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
14.05.2013, 15:38     Реагирование на ошибки (потоки) #2
Цитата Сообщение от IvanInanovich Посмотреть сообщение
ofstream os("a:edata.dat");
os.open("a:edata.dat", ios::trunc | ios::binary);
- ну что за бред, сначала создали поток в дефалтном конструкторе, потом применяем метод опен

Добавлено через 21 секунду
Цитата Сообщение от IvanInanovich Посмотреть сообщение
#include<windows.h>
- к чему он в коде?
-=ЮрА=-
Заблокирован
Автор FAQ
14.05.2013, 15:51     Реагирование на ошибки (потоки) #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
#include <fstream>
#include <iostream>
using namespace std;
 
const int MAX = 64;
int  buff[MAX];
 
int main()
{
    int i;//Г±Г·ВёГІГ·ГЁГЄ
    for(i = 0; i < MAX; i++)
        buff[i] = i;
 
    ofstream ofs;//îáúÿâëÿåì ïîòîê Г§Г*ГЇГЁГ±ГЁ
    ifstream ifs;//îáúÿâëÿåì ïîòîê Г·ГІГҐГ*ГЁГї
 
    ofs.open("data.txt", ios::trunc | ios::binary);
    if(!ofs.is_open() )
        cout<<"Error open data.txt"<<endl;
    else
    {
        ofs.write((char *)&buff, MAX*sizeof(int));
        if(!ofs.good())
            cout<<"Write error"<<endl;
        else
            cout<<"Write good"<<endl;
    }
    ofs.close();
    ifs.open("data.txt", ios::binary);
    if(!ifs.is_open() )
        cout<<"Error open data.txt"<<endl;
    else
    {
        ifs.read((char *)&buff, MAX*sizeof(int));
        if(!ifs.good())
            cout<<"Read error"<<endl;
        else
            cout<<"Read good"<<endl;
        for(i = 0; i < MAX; i++)
        {
            if(i != buff[i])
                cout<<"item "<<i<<" incorrect"<<endl;
        }
        
    }
    ifs.close();
    cin.get();
    return 0;
}
Миниатюры
Реагирование на ошибки (потоки)  
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
14.05.2013, 15:53  [ТС]     Реагирование на ошибки (потоки) #4
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- ну что за бред, сначала создали поток в дефалтном конструкторе, потом применяем метод опен
Я с потоками только знакомлюсь. В коде из книги было так:
ofstream os;
os.open("a:edata.dat", ios::trunc | ios::binary);

Руководясь предыдущими примерами, я создал файл таким образом, т.к. файла этого просто навсего не было.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- к чему он в коде?
exit(1);
Кудаив
328 / 405 / 24
Регистрация: 27.05.2012
Сообщений: 1,162
Завершенные тесты: 2
14.05.2013, 15:58     Реагирование на ошибки (потоки) #5
Цитата Сообщение от IvanInanovich Посмотреть сообщение
exit(1);
убрав windows.h обнаружишь что и так все работает
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.05.2013, 15:58     Реагирование на ошибки (потоки) #6
IvanInanovich, exit находится в cstdlib. Ну и + к тому, нефиг exit-ы в С++ юзать.
-=ЮрА=-
Заблокирован
Автор FAQ
14.05.2013, 15:59     Реагирование на ошибки (потоки) #7
Цитата Сообщение от IvanInanovich Посмотреть сообщение
к чему он в коде?
exit(1);
- правда?
Миниатюры
Реагирование на ошибки (потоки)  
-=ЮрА=-
Заблокирован
Автор FAQ
14.05.2013, 16:04     Реагирование на ошибки (потоки) #8
IvanInanovich, итак в твоём коде есть несколько кардинальных глупостей
1-ая
Цитата Сообщение от IvanInanovich Посмотреть сообщение
a:edata.dat
- где ты видел в именах файлов токен ":"
2-ая

Цитата Сообщение от IvanInanovich Посмотреть сообщение
ofstream os("a:edata.dat");
os.open("a:edata.dat", ios::trunc | ios::binary);
- неправильно делать дефалт конструктор и опен для одного и тогоже объекта

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

Не по теме:

Цитата Сообщение от IvanInanovich Посмотреть сообщение
if(!is)
- есть нормальный метод что для if что для ofstream is_open вот его и используй, юзать тучи exit также не советую, как видишь в моём коде ни одного exit-а и всего два условных оператора, зачем загромождать код?Да и юзать exit не очень то гуд - у тебя main вот и буть добр обходиться return-ами

IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
14.05.2013, 16:34  [ТС]     Реагирование на ошибки (потоки) #9
Цитата Сообщение от Кудаив Посмотреть сообщение
убрав windows.h обнаружишь что и так все работает
У меня без windows.h - не работает. Скрин тому подтверждение.
Миниатюры
Реагирование на ошибки (потоки)  
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.05.2013, 16:35     Реагирование на ошибки (потоки) #10
IvanInanovich, Скрина нет. Подключить cstdlib нужно и все будет ок.
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
14.05.2013, 16:39  [ТС]     Реагирование на ошибки (потоки) #11
Добавлено через 22 секунды
-=ЮрА=-, Спасибо что объяснили.
Единственное,
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
2-ая
- неправильно делать дефалт конструктор и опен для одного и тогоже объекта
можно чуть подробнее что значит в данном контексте "дефалт конструктор" ? как же тогда создать файл, если такового не имеется?

Добавлено через 1 минуту
Цитата Сообщение от ForEveR Посмотреть сообщение
IvanInanovich, Скрина нет. Подключить cstdlib нужно и все будет ок.
А в книге вообще procces.h.
С cstdlib работает , но и с windows.h - не отказывает. Да и не мои это "exit-ы", а из примера из книги : )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2013, 17:17     Реагирование на ошибки (потоки)
Еще ссылки по теме:

C++ VC, потоки.
C++ Потоки
C++ Потоки

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
14.05.2013, 17:17     Реагирование на ошибки (потоки) #12
IvanInanovich, смотри
Цитата Сообщение от IvanInanovich Посмотреть сообщение
ofstream os("a:edata.dat");
ostream является потоковым классом, также как и для всех классов у него есть конструкторы. Т.е чтобы инициализировать поток достаточно вызвать конструктор коим и является
C++
1
ofstream(const char* name, ios::openmode mode=ios::out | ios::trunc);
теперь смотри мы проинициализировали поток(другими словами открыли файл) и теперь опять применяем метод класса для открытия потока

Цитата Сообщение от IvanInanovich Посмотреть сообщение
is.open("a:edata.dat", ios::trunc | ios::binary);
- ну очевидно что это очень неверно, появлялся флаг ошибки (думаю Already open) и код далее

Цитата Сообщение от IvanInanovich Посмотреть сообщение
if(!os){}
- уже не шёл. Ты можешь даже это проверить, модифицируй мой код вот таким образом

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ofstream ofs("data.txt");//объявляем поток записи
* * ifstream ifs;//объявляем поток чтения
ofs.open("data.txt", ios::trunc | ios::binary);
* * if(!ofs.is_open() )
и увидишь что мой код выдаст Write error
Yandex
Объявления
14.05.2013, 17:17     Реагирование на ошибки (потоки)
Ответ Создать тему
Опции темы

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