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

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

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

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

20.05.2013, 23:52. Просмотров 682. Ответов 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.h ..... C++
C++ fstream::setbuf
Хитрый fstream C++
C++ fstream с++
C++ fstream
C++ Работа с fstream
C++ перегрузка fstream
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stima
447 / 296 / 20
Регистрация: 22.03.2011
Сообщений: 961
Завершенные тесты: 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
5415 / 4811 / 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
5415 / 4811 / 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
5415 / 4811 / 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
Еще ссылки по теме:

C++ траблы с fstream
C++ Почему я не могу создать статический элемент класса fstream?
cstdio vs fstream C++
Статический метод как точка входа в поток - как избавиться C++
C++ Функция, поток fstream

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

Или воспользуйтесь поиском по форуму:
alsav22
5415 / 4811 / 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
Ответ Создать тему
Опции темы

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