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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
#1

Статический поток fstream - C++

20.05.2013, 23:52. Просмотров 691. Ответов 9
Метки нет (Все метки)

Нужно создать класс, в котором будет статическое поле класса fstream (для записи и чтения из файла). С помощью статического метода поток нужно открыть. Поток не должен закрываться на протяжении всего времени работы программы. Так же, нужен метод который будет сбрасывать указатель файла на 0.
Все задание скидывать не стал, но суть я думаю понятна.

Код который я написал не хочет работать. Парюсь я с ним еще с прошлой ночи. Было казалось находился я у "финиша"... Работал вывод всех данных, но не работал поиск человека, если комментил сам вызов метода вывода данных(через объект из функции меин) то поиск находил человека по цифре.. Вообщем работал толи вывод, толи поиск, 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
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
#include <iostream>
#include <fstream>
#include<cstring>
 
using namespace std;
 
const int m = 10;
class Name
{
private:
char name[m];
char surname[m];
int number;
static fstream fstr;
 
public:
 
void putdata() // Ввести данные и записать в фаил.
{
    if( !fstr.is_open() )
    {
    cout << "\nFail no open.\n";
    return;
    }
 
cout << "\nEnter name: "; cin >> name;
cout << "Enter surname: "; cin >> surname;
cout << "Enter number: "; cin >> number;
fstr << name << ' ' << surname << ' ' << number << endl;
 
}
static void openstream() // Открыть поток и ассоциировать его с файлом.
{
fstr.open("Seven.txt", ios::in | ios::out | ios::app); // Бит режима: для записи, чтения, запись с конца файла.
}
 
static void resetpointer() // Сбросить указатель файла
{
fstr.seekg(0,ios::beg);
}
 
void getdata() // Вывести данные одной особи
{
cout << "\nName: " << name;
cout << "\nSurname: " << surname;
cout << "\nNumber: " << number;
}
 
void alldata() //Вывести ВСЕ данные, которе находяться в файле.
{
    
while(!fstr.eof())
{
 
getdata();
 
fstr >> name >> surname >> number;
 
}
 
 
}
 
void search( int b ) // Поиск человка по номеру
{
 
while(true)
{
    fstr >> name >> surname >> number;
        
        if(b == number)
            break;
 
        if(fstr.eof())
            {
        cerr << "\nError. The man was not found..\n";
        strcpy(name,"NULL");
        strcpy(surname,"NULL");
        number = 0;
        break;
            }
 
}
}
 
};
 
fstream Name::fstr; // Статический поток
 
int main()
{
 
Name n1; // создаем объект
Name::openstream(); // открываем поток
n1.putdata(); // Вводдим данные
n1.putdata();
n1.putdata();
 
Name::resetpointer(); // Сбрасываем указатель на 0
cout << "\nOutput all data: \n";
n1.alldata(); // Вывод ВСЕХ данных из файла
 
cout << endl;
 
Name::resetpointer(); // Сбрасываем указатель.
cout << "\nSearch...\n";
n1.search(2); // Поиск человека с номером 2
n1.getdata(); // Вывод информации о человеке иначе все поля NULL
 
return 0;
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2013, 23:52     Статический поток fstream
Посмотрите здесь:

Почему я не могу создать статический элемент класса fstream? - C++
Ошибка: Код: #include &lt;iostream&gt; using namespace std; #include &lt;fstream&gt; const int MAX = 30; class worker {

Функция, поток fstream - C++
Здравствуйте! Делаю программку по заданию (тест), все не сложно, но вот где вопрос. #include &lt;fstream&gt; #include &lt;iostream&gt; ...

Хитрый fstream - C++
Привет всем! Вот есть код, казалось бы без ошибок... #include &lt;windows.h&gt; #include &lt;fstream&gt; #include &lt;vector&gt; #include...

cstdio vs fstream - C++
Есть программа, виводящяя 16-ричный дамп бинарного файла (вместо каждого байта входного файла виводится значение в 16-ричной системе) Для...

из cstdio в fstream - C++
вод программа, написанная через функцию cstdio #include &quot;stdafx.h&quot; #include &lt;cstdio&gt; #include &lt;iostream&gt; #pragma warning(disable:...

не работает fstream.h - C++
Всем доброго дня !!! Решил поработать с файлами. В учебнике четко сказанно , что fstream.h не требует iostream.h В...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stima
449 / 298 / 20
Регистрация: 22.03.2011
Сообщений: 966
Завершенные тесты: 2
21.05.2013, 01:34     Статический поток fstream #2
Лучше скиньте задание полностью. Возможно вы его не так интерпретировали.
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
21.05.2013, 14:19  [ТС]     Статический поток fstream #3
Вот целое задание
Миниатюры
Статический поток fstream  
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.05.2013, 15:17     Статический поток fstream #4
C++
1
2
3
4
5
static void resetpointer() // Сбросить указатель файла
{
    fstr.clear();
    fstr.seekg(0, ios::beg);
}
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
21.05.2013, 18:10  [ТС]     Статический поток fstream #5
alsav22, не помогло.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.05.2013, 18:50     Статический поток fstream #6
Что значит не помогло? У меня всё работает.
Миниатюры
Статический поток fstream  
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
21.05.2013, 18:57  [ТС]     Статический поток fstream #7
alsav22, после ввода последних данных зацикливание происходит. Возможно вы еще что-то подправили?
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.05.2013, 19:01     Статический поток fstream #8
Ещё alldata() измените, а то лишнее выводит:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void alldata() //Вывести ВСЕ данные, которе находяться в файле.
{
    
    while(!fstr.eof())
    {
        fstr >> name; 
        if (fstr.eof()) break;
        fstr >> surname >> number;
        
        getdata();
    }
}
Добавлено через 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
#include <iostream>
#include <fstream>
#include<cstring>
 
using namespace std;
 
const int m = 10;
class Name
{
private:
char name[m];
char surname[m];
int number;
 
static fstream fstr;
 
public:
 
void putdata() // Ввести данные и записать в фаил.
{
    if( !fstr.is_open() )
    {
        cout << "\nFail no open.\n";
        return;
    }
 
cout << "\nEnter name: "; cin >> name;
cout << "Enter surname: "; cin >> surname;
cout << "Enter number: "; cin >> number;
fstr << name << ' ' << surname << ' ' << number << endl;
 
}
static void openstream() // Открыть поток и ассоциировать его с файлом.
{
    fstr.open("Seven.txt", ios::in | ios::out | ios::app); // Бит режима: для записи, чтения, запись с конца файла.
}
 
static void resetpointer() // Сбросить указатель файла
{
    fstr.clear();
    fstr.seekg(0, ios::beg);
}
 
void getdata() // Вывести данные одной особи
{
cout << "\nName: " << name;
cout << "\nSurname: " << surname;
cout << "\nNumber: " << number;
}
 
void alldata() //Вывести ВСЕ данные, которе находяться в файле.
{
    
    while(!fstr.eof())
    {
        fstr >> name; 
        if (fstr.eof()) break;
        fstr >> surname >> number;
        
        getdata();
    }
}
 
void search( int b ) // Поиск человка по номеру
{
 
while(true)
{
    fstr >> name >> surname >> number;
        
        if(b == number)
            break;
 
        if(fstr.eof())
        {
            cerr << "\nError. The man was not found..\n";
            strcpy(name,"NULL");
            strcpy(surname,"NULL");
            number = 0;
            break;
        }
 
}
}
 
};
 
fstream Name::fstr; // Статический поток
 
int main()
{
 
Name n1; // создаем объект
Name::openstream(); // открываем поток
n1.putdata(); // Вводдим данные
n1.putdata();
n1.putdata();
 
Name::resetpointer(); // Сбрасываем указатель на 0
cout << "\nOutput all data: \n";
n1.alldata(); // Вывод ВСЕХ данных из файла
 
cout << endl;
 
Name::resetpointer(); // Сбрасываем указатель.
cout << "\nSearch...\n";
n1.search(2); // Поиск человека с номером 2
n1.getdata(); // Вывод информации о человеке иначе все поля NULL
 
 
cout << endl;
system("pause");
return 0;
}
Миниатюры
Статический поток fstream  
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
21.05.2013, 20:10  [ТС]     Статический поток fstream #9
alsav22, странно. Когда поменял название файла, т.е. начал с чистого - программа заработала. Возможно из-за ошибочного ввода, который записался в файл считывало криво и происходило зацикливание. Но по идее eof() должен был всё равно сработать в цикле.
Если не затруднит, то скажите какую я ошибку допустил. Я так понимаю методом clean() мы сняли флаги ошибок. Т.е. где-то в программе происходит ошибка, которая и ставит данный флаг.
И спасибо, что помогли.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2013, 22:20     Статический поток fstream
Еще ссылки по теме:

Из fstream в cstdio - C++
Всем привет. Стоит задача: Написать программу, которая считывает текст из файла и записывает в другой файл только те предложения, которые...

Ошибка с fstream - C++
При создании исполняемого файла (т.е release версии) вылезает ошибка: raised exception class EAccessViolation with message 'Access...

Работа с fstream - C++
Здорова! Создал класс для записи и чтения файла через операцию , но почему то он работает не так как нужно. #include &lt;iostream&gt; ...

Класс fstream - C++
Здравствуйте, Уважаемые форумчане ! Есть код: //Дан файл, содержащий несколько строк. Найти максимальную длину строки и вывести в...


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

Или воспользуйтесь поиском по форуму:
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.05.2013, 22:20     Статический поток fstream #10
Цитата Сообщение от IvanInanovich Посмотреть сообщение
Возможно из-за ошибочного ввода, который записался в файл
Скорее всего.
Цитата Сообщение от IvanInanovich Посмотреть сообщение
Если не затруднит, то скажите какую я ошибку допустил. Я так понимаю методом clean() мы сняли флаги ошибок. Т.е. где-то в программе происходит ошибка, которая и ставит данный флаг.
Обратите вниминие, в задании пишется о функции, которая сбрасывает файловый указатель и устанавливает его на начало фала. Речь идёт о двух действиях. У вас в коде было только второе. Метод clear() без параметра (по умолчанию праметр равен goodbit) сбрасывает все флаги потока в ноль. Это и есть сброс файлового указателя. Есть такой флаг потока - eofbit, который устанавливается при достижении конца файла. Вот его, в данном коде, и нужно было сбросить после вывода всех данных из файла (здесь достигался конец файла). Без этого поток просто не работал. В частности, не срабатывал seekg(), т.е. курсор не возвращался в начало.
Yandex
Объявления
21.05.2013, 22:20     Статический поток fstream
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru