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

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

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

Как сделать ввод данных в файл с использованием связанного списка - C++

18.01.2016, 15:31. Просмотров 205. Ответов 3
Метки c++ (Все метки)

у меня есть односторонний связанный список который расставляет данные в порядке увеличения.
данные это порядковый номер персонала.
проблема заключается в том чтобы данные записывались в файл именно по принципу связанного списка. в порядке возрастания 1,3,5,6,7 и т.д.
данные в файл записываются, но в хаотичном порядке.
но как это реализовать пока не знаю.
также буду рад, если оцените мой код и скажите примерно на каком уровне програмирования я нахожусь.
соответствую ли я junior уровню.
учусь около четырех месяцев.
спасибо заранее за помощь

вот исходный код:

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
#include <iostream>
#include <string>
#include<fstream>
typedef unsigned short USHORT;
using namespace std;
#include "данные.h"
#include "связанный список.h"
#include "ввод и вывод данных.h"
 
 
void Interface()
{
 
 
}
 
int main()
{
    setlocale(LC_ALL, "rus");
    Data personal;
    bool OnOf = true;
    
 
    while (OnOf)
    {
        short selection;
        cout << "Выберите операцию - (1)Ввод данных, (2) Чтение данных, (3) Очистка файла. (0) Выход\n";
        cin >> selection;
        //выбор операции файла.
        switch (selection)
        {
        case 1:personal.SpisokPersonal(); break;
        case 2:personal.SetFileName(); personal.Readfile(); break;
        case 3:personal.SetFileName(); personal.CleanFile(); break;
        case 0:  OnOf = false; break;
        default:continue;
        }
         
    }
    
    
    
    system("pause");
    return 0;
}
заголовочный файл - данные:
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
//класс данных персонала
 
class Employee
{
public:
    Employee();
    
    Employee(char *, char *, char *, long, long);
    ~Employee();
    Employee(const Employee&);
    Employee & operator=(const Employee &);
    long Compare(const Employee &);
    virtual void Display()const
    {   
        cout << "*****************************\n";
        cout.setf(ios::left);
        cout << " Номер персонала: \t\a"<< ItsNumberPersonal << endl;
        cout << " Имя: \t" << ItsFirstName << endl;
        cout << " Фамилия: \t" << ItsLastName << endl;
        cout << " Адресс: \t" << ItsAddress << endl;
        cout << " Зарплата: \t" << ItsSalary << endl;
        cout << "*****************************\n";
        cout << "\n";
    }
 
    //Функции вывода инфорамации 
    const string   & GetFirstName()const
    {
        return ItsFirstName;
    }
    const string  & GetLastName()const
    {
        return ItsLastName;
    }
    const  string & GetAddress()const
    {
        return ItsAddress;
    }
    long GetSalary()const
    {
        return ItsSalary;
    }
    long GetNumberPersonal()const
    {
         return ItsNumberPersonal;
    }
 
 
    //Функции Ввода информации.
    void  SetFirstName(const string & FName)
    {
        ItsFirstName = FName;
    }
    void SetLastName(const string & LName)
    {
        ItsLastName = LName;
    }
    void SetAddress(const string & address)
    {
        ItsAddress = address;
    }
    void SetSalary(long salary)
    {
        ItsSalary = salary;
    }
    void SetNumberPersonal(long numberpersonal)
    {
        ItsNumberPersonal = numberpersonal;
    }
private:
    string ItsFirstName;
    string ItsLastName;
    string ItsAddress;
    long ItsSalary;
    long ItsNumberPersonal;
};
 
 
 
Employee::Employee() :
ItsFirstName(" "),
ItsLastName(" "),
ItsAddress(" "),
ItsSalary(0),
ItsNumberPersonal(1)
{}
 
 
Employee::Employee(char  * firstName, char * lastName, char * address, long salary,long numberPersonal) :
ItsFirstName(firstName),
ItsLastName(lastName),
ItsAddress(address),
ItsSalary(salary),
ItsNumberPersonal(numberPersonal)
{}
 
Employee::Employee(const Employee & rhs) :
ItsFirstName(rhs.GetFirstName()),
ItsLastName(rhs.GetLastName()),
ItsAddress(rhs.GetAddress()),
ItsSalary(rhs.GetSalary()),
ItsNumberPersonal(rhs.GetNumberPersonal())
{}
Employee::~Employee(){}
Employee & Employee::operator= (const Employee & rhs)
{
    if (this == &rhs)
    {
        return *this;
    }
    ItsFirstName = rhs.GetFirstName();
    ItsLastName = rhs.GetLastName();
    ItsAddress = rhs.GetAddress();
    ItsSalary = rhs.GetSalary();
    ItsNumberPersonal = rhs.GetNumberPersonal();
 
    return *this;
}
заголовочный файл - связанный список:

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
//Шаблон связанного списка.
// константные перечисления для определения местоположения данных, в связаном списке.
enum { KisSmaller, KisLarger, KisSame };
 
///сами данные и функция сравнения.
long Employee::Compare(const  Employee & TheOtheNumber)
{
    if (ItsNumberPersonal < TheOtheNumber.ItsNumberPersonal)
    {
        return KisSmaller;
    }
    else if (ItsNumberPersonal> TheOtheNumber.ItsNumberPersonal)
        return KisLarger;
 
    else
        return KisSame;
}
 
 
template<class T_Spisok>
//чистый виртуальный класс ADT.
class Node
{
public:
    Node(){}
    virtual ~Node(){}
    //чиста виртуальная а функция сравнения.
    virtual Node * pInsert(T_Spisok * TheObject) = 0;
//чиста виртуальная функция отображения
    virtual void Display()const = 0;
private:
};
 
template<class T_Spisok>
//Внутрений узел. здесь храняться адрес расположения данных
class InternalNode : public Node<T_Spisok>
{
public:
    InternalNode(T_Spisok * TheObject, Node<T_Spisok> * next);
 
    virtual ~InternalNode(){ delete T_MyNext, delete T_MyOblect; }
    //виртуальная функция отображения адрессов, расположения данных.
    virtual void Display()const
    {
        T_MyOblect->Display(); T_MyNext->Display();
    }
    virtual Node<T_Spisok> * pInsert(T_Spisok * TheObject);
private:
    T_Spisok * T_MyOblect;
    Node<T_Spisok> * T_MyNext;
};
template<class T_Spisok>
InternalNode<T_Spisok>::InternalNode(T_Spisok * TheObject, Node<T_Spisok> * next) :
T_MyOblect(TheObject),
T_MyNext(next)
{}
 
template <class T_Spisok>
 
// функция распределения данных.
Node<T_Spisok> * InternalNode<T_Spisok>::pInsert(T_Spisok * TheObject)
{
    long result = T_MyOblect->Compare(*TheObject);
    switch (result)
    {
    case KisSame:
    case KisLarger:
    {
                      InternalNode<T_Spisok> * ObjectNode = new  InternalNode<T_Spisok>(TheObject, this);
                      return ObjectNode;
    }
    case KisSmaller:
        T_MyNext = T_MyNext->pInsert(TheObject);
        return this;
 
        
    }
    return this;
}
template <class T_Spisok>
class TailNode :public Node<T_Spisok>
{
public:
    TailNode(){}
    virtual ~TailNode(){}
    virtual Node<T_Spisok>  * pInsert(T_Spisok * TheObject);
    virtual void Display() const { }
private:
 
};
template <class T_Spisok>
Node<T_Spisok> * TailNode<T_Spisok>::pInsert(T_Spisok * TheObject)
{
    InternalNode<T_Spisok> * ObjectNode = new InternalNode<T_Spisok>(TheObject, this);
    return ObjectNode;
}
template <class T_Spisok>
    class HeadNode :public Node<T_Spisok>
{
public:
    HeadNode();
    virtual ~HeadNode(){ delete T_MyNext; }
    virtual Node<T_Spisok> * pInsert(T_Spisok * TheObject);
    virtual void Display()const { T_MyNext -> Display(); }
private:
    Node<T_Spisok> * T_MyNext;
};
    template <class T_Spisok>
    HeadNode<T_Spisok>::HeadNode()
{
        T_MyNext = new TailNode<T_Spisok>;
}
    template <class T_Spisok>
 
    Node<T_Spisok> * HeadNode<T_Spisok>::pInsert(T_Spisok * TheObject)
{
    T_MyNext = T_MyNext->pInsert(TheObject);
    return this;
 
}
    template <class T_Spisok>
class LinkedList
{
public:
    LinkedList();
    ~LinkedList(){ delete MyHead; }
    void Insert(T_Spisok * TheObject);
    void ShowAll(){ MyHead->Display(); }
private:
    HeadNode<T_Spisok> * MyHead;
};
 
template <class T_Spisok>
LinkedList<T_Spisok>::LinkedList()
{
    MyHead = new HeadNode<T_Spisok>;
}
template <class T_Spisok>
void LinkedList<T_Spisok>::Insert(T_Spisok * TheObject)
{
    MyHead->pInsert(TheObject);
}
заголовочный файл - ввод и вывод данных:

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
class Data
{
public:
    
    void SpisokPersonal();
    void Readfile();
    //очистка содержимого файла
    void CleanFile()
    {
        ofstream fout(ItsDataFileName,ios::trunc);
    }
    void SetFileName(){ ItsDataFileName = "файл данных персонала: \n"; }
    
private:
    string ItsDataFileName;
};
//Ввод данных 
void Data::SpisokPersonal()
{
    Employee * pEmployee;
    long val, salary;
    //данные подключенные к шаблону связанного списка
    LinkedList<Employee> List;
    string firsName, lastName, address;
    char address2[31];
    string buffer, filename = "файл данных персонала: \n"; // инициализация переменной filename названием файла
 
    //отерытие файла с возможностью вводить данные в конце файла
    ofstream fout(filename, ios::app);
    //если файл равно нулю, то выйдет сообщение об открытии нового файла
    if (!fout)
    {
        cout << "Unable to open " << filename << " for appending. \n";
 
    }
    for (;;)
    {
 
        cout << "Введите номер персонала (0 стоп): ";
        (cin >> val).get();
        if (!val)
            break;
        cout << endl;
        cout << "Введите имя работника: ";
        cin >> firsName;
 
        cout << endl;
        cout << "Введите фамилию работника: ";
        cin >> lastName;
        cout << endl;
        cout << "Введите адресс работника: ";
        cin.ignore(30, '\n');
        cin.getline(address2, 30);
        address = address2;
        cout << endl;
        cout << "Введите зарплату работника: ";
        (cin >> salary).get();
        cout << endl;
        pEmployee = new Employee(" none", "none", "usa sexy", salary, val);
 
        pEmployee->SetFirstName(firsName);
        pEmployee->SetLastName(lastName);
        pEmployee->SetAddress(address);
        pEmployee->SetSalary(salary);
        pEmployee->SetNumberPersonal(val);
 
        ///Ввод данных в файл!
        fout << "*****************************\n";
        fout << "Номер персонала: \t" << val << endl;
        fout << "Имя: \t" << firsName << endl;
        fout << " Фамилия: \t" << lastName << endl;
        fout << " Адресс: \t" << address << endl;
        fout << " Зарплата: \t" << salary << endl;
        fout << "*****************************\n";
        fout << endl;
 
 
        //передача данных в связанный список.
        List.Insert(pEmployee);
        //инициализация файла именем
        ItsDataFileName = filename;
        
 
    }
    fout.close();
 
    system("cls");
 
    List.ShowAll();
    
}
 
//чтение файла
void Data::Readfile()
{
    
    char ch;
    ifstream fin(ItsDataFileName);
    if (fin)
    {
        cout << "curent file contents: \n";
 
        char ch;
        while (fin.get(ch))
            cout << ch;
        cout << "\n*** end of  file contents***\n";
    }
    fin.close();
    cout << "\n Opening " << ItsDataFileName << "in append mode...\n";
 
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.01.2016, 15:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сделать ввод данных в файл с использованием связанного списка (C++):

ввод структурированных данных в файл и вывод данных из этого файла на экран (сделать хра-нилище данных в файле). - C++
Здравствуйте) помогите написать программу, осуществляющую ввод структурированных данных в файл и вывод данных из этого файла на экран...

Как наиболее быстро определить зацикливание связанного списка? (a => b => c => d => e => a) - C++
You have a pointer to some element in a linked list (a =&gt; b =&gt; c =&gt; d =&gt; e). What is the fastest way to tell if there is a loop in the...

Как правильно создать двумерный массив указателей с использованием calloc? и ввод данных в него - C++
Как правильно создать двумерный массив указателей с использованием calloc и ввести в него данные?

Как сделать ввод данных двумерного массива с файла? - C++
Дан двумерный массив, надо сделать ввод и вывод данных в файле. Что бы данные вводились с файла и выводились в файл. ...

Окончание связанного списка - C++
Скажите, пожалуйста, как в моём случае можно поступить: выйти из цикла, если нажатием Enter ничего не вводится и выдавать ошибку, если...

Стек на основе связанного списка C++ - C++
Привет:) Мне нужно разработать функции занесения и извлечения данных стека на основе связанного списка!на основе массива уже написала, а...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
mercurygermes
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 179
21.01.2016, 14:58  [ТС] #2
решение я нашел. )))
если кому нужен код, могу выдать
0
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
21.01.2016, 15:07 #3
mercurygermes, Не надо ждать, когда код понадобится.
Опубликуйте решение, т.к. неизвестно через сколько лет оно может пригодиться.
Следуйте П.4.11.Правил
"Если вопрос был решен вами самостоятельно, отпишите об этом в своей теме - есть и другие люди, которые столкнутся с той же проблемой, и им поможет ваш ответ."
1
mercurygermes
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 179
22.01.2016, 15:31  [ТС] #4
вот решение. нужно Ввод данных описать внутри класса самих данных, тогда данные будут записываться во время показа на экран.

вот участок кода данных в которых был непосредственно добавлен изменеие.
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
virtual void Display()const
    {   
        string filename = "файл данных персонала: \n"; // инициализация переменной filename названием файла
 
        //отерытие файла с возможностью вводить данные в конце файла
        ofstream fout(filename, ios::app);
        
        if (!fout)
        {
            cout << "Unable to open " << filename << " for appending. \n";
 
        }
        else
 
        {
 
 
            cout << "*****************************\n";
            cout << " Номер персонала: \t\a";
            cout << ItsNumberPersonal << endl;
            cout << " Имя: \t" << ItsFirstName << endl;
            cout << " Фамилия: \t" << ItsLastName << endl;
            cout << " Адресс: \t" << ItsAddress << endl;
            cout << " Зарплата: \t" << ItsSalary << endl;
            cout << "*****************************\n";
            cout << "\n";
 
            ///Ввод данных в файл!
            fout << "*****************************\n";
            fout << "Номер персонала: \t" << ItsNumberPersonal << endl;
            fout << "Имя: \t" << ItsFirstName << endl;
            fout << " Фамилия: \t" << ItsLastName << endl;
            fout << " Адресс: \t" << ItsAddress << endl;
            fout << " Зарплата: \t" << ItsSalary << endl;
            fout << "*****************************\n";
            fout << endl;
            fout.close();
        }
    }
полный код:

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
//класс данных персонала
 
class Employee
{
public:
    Employee();
    
    Employee(char *, char *, char *, long, long);
    ~Employee();
    Employee(const Employee&);
    Employee & operator=(const Employee &);
    long Compare(const Employee &);
    virtual void Display()const
    {   
        string filename = "файл данных персонала: \n"; // инициализация переменной filename названием файла
 
        //отерытие файла с возможностью вводить данные в конце файла
        ofstream fout(filename, ios::app);
        
        if (!fout)
        {
            cout << "Unable to open " << filename << " for appending. \n";
 
        }
        else
 
        {
 
 
            cout << "*****************************\n";
            cout << " Номер персонала: \t\a";
            cout << ItsNumberPersonal << endl;
            cout << " Имя: \t" << ItsFirstName << endl;
            cout << " Фамилия: \t" << ItsLastName << endl;
            cout << " Адресс: \t" << ItsAddress << endl;
            cout << " Зарплата: \t" << ItsSalary << endl;
            cout << "*****************************\n";
            cout << "\n";
 
            ///Ввод данных в файл!
            fout << "*****************************\n";
            fout << "Номер персонала: \t" << ItsNumberPersonal << endl;
            fout << "Имя: \t" << ItsFirstName << endl;
            fout << " Фамилия: \t" << ItsLastName << endl;
            fout << " Адресс: \t" << ItsAddress << endl;
            fout << " Зарплата: \t" << ItsSalary << endl;
            fout << "*****************************\n";
            fout << endl;
            fout.close();
        }
    }
 
    //Функции вывода инфорамации 
    const string   & GetFirstName()const
    {
        return ItsFirstName;
    }
    const string  & GetLastName()const
    {
        return ItsLastName;
    }
    const  string & GetAddress()const
    {
        return ItsAddress;
    }
    long GetSalary()const
    {
        return ItsSalary;
    }
    long GetNumberPersonal()const
    {
         return ItsNumberPersonal;
    }
 
 
    //Функции Ввода информации.
    void  SetFirstName(const string & FName)
    {
        ItsFirstName = FName;
    }
    void SetLastName(const string & LName)
    {
        ItsLastName = LName;
    }
    void SetAddress(const string & address)
    {
        ItsAddress = address;
    }
    void SetSalary(long salary)
    {
        ItsSalary = salary;
    }
    void SetNumberPersonal(long numberpersonal)
    {
        ItsNumberPersonal = numberpersonal;
    }
private:
    string ItsFirstName;
    string ItsLastName;
    string ItsAddress;
    long ItsSalary;
    long ItsNumberPersonal;
};
 
 
 
Employee::Employee() :
ItsFirstName(" "),
ItsLastName(" "),
ItsAddress(" "),
ItsSalary(0),
ItsNumberPersonal(1)
{}
 
 
Employee::Employee(char  * firstName, char * lastName, char * address, long salary,long numberPersonal) :
ItsFirstName(firstName),
ItsLastName(lastName),
ItsAddress(address),
ItsSalary(salary),
ItsNumberPersonal(numberPersonal)
{}
 
Employee::Employee(const Employee & rhs) :
ItsFirstName(rhs.GetFirstName()),
ItsLastName(rhs.GetLastName()),
ItsAddress(rhs.GetAddress()),
ItsSalary(rhs.GetSalary()),
ItsNumberPersonal(rhs.GetNumberPersonal())
{}
Employee::~Employee(){}
Employee & Employee::operator= (const Employee & rhs)
{
    if (this == &rhs)
    {
        return *this;
    }
    ItsFirstName = rhs.GetFirstName();
    ItsLastName = rhs.GetLastName();
    ItsAddress = rhs.GetAddress();
    ItsSalary = rhs.GetSalary();
    ItsNumberPersonal = rhs.GetNumberPersonal();
 
    return *this;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2016, 15:31
Привет! Вот еще темы с ответами:

Проблемы с удалением связанного списка(С++) - C++
Здравствуйте! Передо мной стоит следующая задача: необходимо создать список, вывести его на экран и удалить. Программу необходимо запускать...

Удаление элемента из связанного списка - C++
Нужно удалить все элементы списка кратные 3. void Del() { if (head == NULL) cout &lt;&lt; &quot;\nСписок пуст\n\n&quot;; else { DoubleList...

Создание индекса связанного списка - C++
Доброго времени суток! Требуется создать класс (IndexedList) индекс для улучшения производительности поиска в связанном списке: Вот...

Ввод данных с использованием argv и argc - C++
не могу понять почему программа не работает без использования ввода из командной строки работает,а так нет подскажите пожалуйста в чём...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.01.2016, 15:31
Ответ Создать тему
Опции темы

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