Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

20.05.2013, 23:52. Просмотров 769. Ответов 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;
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2013, 23:52
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Статический поток fstream (C++):

Почему я не могу создать статический элемент класса 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; ...

Статический метод как точка входа в поток - как избавиться - C++
Привет всем.Вопрос такой: использую потоки в своей программе,они создаются и уничтожаются в классе, и в классе так же находится...

Нужно создать статический массив строк как статический массив указателей на строки. Условние ниже --> - C++
Слова английского текста рассортировать по возрастанию количества заданной буквы в слове. Слова с одинаковым количеством такой буквы...

создать статический массив строк как статический массив указателей на строки, задание ниже --> - C++
Слова английского текста, начинающиеся с гласных букв, рассортировать в алфавитном порядке по первой согласной букве слова. Остальные слова...

Скопировать поток и добавить ошибки в поток - C++
Здорова господа! Есть задачка: &quot;Скопируйте поток объектов типа Name_and_address и вставьте в него столько ошибок, сколько сколько...

9
stima
495 / 345 / 43
Регистрация: 22.03.2011
Сообщений: 1,107
Завершенные тесты: 2
21.05.2013, 01:34 #2
Лучше скиньте задание полностью. Возможно вы его не так интерпретировали.
0
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
21.05.2013, 14:19  [ТС] #3
Вот целое задание
0
Миниатюры
Статический поток fstream  
alsav22
5434 / 4829 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.05.2013, 15:17 #4
C++
1
2
3
4
5
static void resetpointer() // Сбросить указатель файла
{
    fstr.clear();
    fstr.seekg(0, ios::beg);
}
1
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
21.05.2013, 18:10  [ТС] #5
alsav22, не помогло.
0
alsav22
5434 / 4829 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.05.2013, 18:50 #6
Что значит не помогло? У меня всё работает.
1
Миниатюры
Статический поток fstream  
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
21.05.2013, 18:57  [ТС] #7
alsav22, после ввода последних данных зацикливание происходит. Возможно вы еще что-то подправили?
0
alsav22
5434 / 4829 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.05.2013, 19:01 #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;
}
1
Миниатюры
Статический поток fstream  
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
21.05.2013, 20:10  [ТС] #9
alsav22, странно. Когда поменял название файла, т.е. начал с чистого - программа заработала. Возможно из-за ошибочного ввода, который записался в файл считывало криво и происходило зацикливание. Но по идее eof() должен был всё равно сработать в цикле.
Если не затруднит, то скажите какую я ошибку допустил. Я так понимаю методом clean() мы сняли флаги ошибок. Т.е. где-то в программе происходит ошибка, которая и ставит данный флаг.
И спасибо, что помогли.
0
alsav22
5434 / 4829 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.05.2013, 22:20 #10
Цитата Сообщение от IvanInanovich Посмотреть сообщение
Возможно из-за ошибочного ввода, который записался в файл
Скорее всего.
Цитата Сообщение от IvanInanovich Посмотреть сообщение
Если не затруднит, то скажите какую я ошибку допустил. Я так понимаю методом clean() мы сняли флаги ошибок. Т.е. где-то в программе происходит ошибка, которая и ставит данный флаг.
Обратите вниминие, в задании пишется о функции, которая сбрасывает файловый указатель и устанавливает его на начало фала. Речь идёт о двух действиях. У вас в коде было только второе. Метод clear() без параметра (по умолчанию праметр равен goodbit) сбрасывает все флаги потока в ноль. Это и есть сброс файлового указателя. Есть такой флаг потока - eofbit, который устанавливается при достижении конца файла. Вот его, в данном коде, и нужно было сбросить после вывода всех данных из файла (здесь достигался конец файла). Без этого поток просто не работал. В частности, не срабатывал seekg(), т.е. курсор не возвращался в начало.
1
21.05.2013, 22:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2013, 22:20
Привет! Вот еще темы с ответами:

Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде локальной переменной внутри функции. - C++
Совсем не понял эту тему. Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде...

fstream - C++
Всем доброго дня! Как с помощью библиотеки fstream вывести содержимое файла на экран??

fstream и for - C++
Здрасте. Собственно, не могу понять, по какой причине не работает вот такой вот код, хотя по идее должен работать, или я ошибаюсь? ...

fstream - C++
Дан текстовый файл. Осуществить посимвольную чередующуюся печать файла в прямом и обратном направлении в новый файл. Например, если в файле...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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