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

Запись и чтение структуры в/из файла - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Что будет в переменных в результате выполнения кода? http://www.cyberforum.ru/cpp-beginners/thread1231741.html
программный код: int z=6, x=-2, y=4; z+=y=5+x--; Что будет в переменных в результате выполнения?
C++ Классы, разобраться с объявлением объектов я написала вот такую программу по условию: Класс должен содержать методы для ввода и вывода данных объектов, а также для выполнения арифметических операций. Кроме того, необходимо включить в состав класса функцию, приводящую дробь к несократимому виду. Функция должна находить наибольший общий делитель числителя и знаменателя и делить числитель и знаменатель на это значение. Можно вызывать... http://www.cyberforum.ru/cpp-beginners/thread1231737.html
C++ Регулярные выражения с игнорированием спецсимволов
Здравствуйте. Решил попробовать регулярные выражения в Visual C++ 2010. Задача такая: пользователь вводит (считывается параметр) текст и его нужно преобразовать в регулярку с игнорированием всех спецсимволов. Использую стандартную библиотеку <regex>. Предположим что пользователь ввел: .txt, хотя в данном случае он сработает правильно, но если в исходной строке (l) вместо точки будет другой...
Заполнить вектор длиной 10 квадратами целых чисел и вывести его в выходной поток C++
Библиотека STL на С++ помогите исправить ошибки задание: Заполнить вектор длинной 10 квадратами целых чисел и вывести его в выходной поток. решение: #include <vector> #include <algorithm> #include <iostream> using namespace std;
C++ Тернарный оператор и множество ошибок в коде http://www.cyberforum.ru/cpp-beginners/thread1231669.html
Вот задание: И простой код: #include<iostream> using namespace std; int main() { int n,k; cin>>n; cin>>k;
C++ Dev c++, компилятор не понимает функцию toupper() Короче, вот такая штука; когда хотел использовать функцию touper(), заголовка <cctype>, компилятор эту функцию воспринимает за переменную( необьявленную). Чуть ранее то же самое делал при любой функции <graphics.h>. Я так понял что dev c++ не содержит эти заголовки. Правильно ли я думаю? И если это так как добавить в компилятор эти файлы, или лучше на visual studio переходить? подробнее

Показать сообщение отдельно
Faltfromoss
0 / 0 / 0
Регистрация: 28.03.2014
Сообщений: 32

Запись и чтение структуры в/из файла - C++

21.07.2014, 23:46. Просмотров 780. Ответов 2
Метки (Все метки)

Столкнулся с очередной проблемой. Есть несколько участков кода:

Структура "Абонент":
C++
1
2
3
4
5
6
7
8
9
struct Subscriber
{
   char FIO [50];
   int YearOfBirth;
   char Town [20];
   char Number [15];
 
   Subscriber * left, * right, * parent;
};
А также класс Tree - бинарное дерево, которое сортирует эти структуры.
В классе Tree есть функция SaveInFile - сохранение всех записей в файл:

C++
1
2
3
4
5
6
7
8
9
void Tree::SaveInFile (Subscriber * Node, FILE * F)
{
    if(Node != 0)
    {
        SaveInFile (Node->left, F);
            fwrite (Node, sizeof (Subscriber), 1, F);
        SaveInFile (Node->right, F);
    }
}
И, соответственно функция чтения из файла:
C++
1
2
3
4
5
6
7
8
9
void Tree::ReadOutFile (FILE * F)
{
    while (!feof (F))
    {
        Subscriber *Node = new Subscriber;
        fread (Node, sizeof (Subscriber), 1, F);
        Insert (Node); // вставляет указатель на считанную структуру в дерево
    }
}
Метод SaveInFile в свою очередь вызывается в функции SaveBase:

Кликните здесь для просмотра всего текста

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
void  SaveBase (Tree &T)        //сохранение базы в файл
{
    int key = 0;
    // записать в существующий файл или создать новый?
    do
    {
        system ("cls");     
        cout<<endl<<"\tЗаписать в существующий файл (1) или создать новый (2) ?: ";
        key = _getch();
    } while (key !=49 && key!=50);
    
    FILE *Base;
    char buffer [200];
 
    switch (key)
    {
    case '1':                   //Если в существующий
        system ("cls");         
        cout<<endl<<"\tВведите путь или имя файла: ";
        gets_s (buffer);
        strcat (buffer, ".txt");
        if(_access(buffer, 00) == -1)
        {
            cout<<endl<<"\tУказан неверный путь или имя файла";
            return;
        }
        
        if (!(Base = fopen (buffer, "w")))
        {
            cout<<endl<<endl<<"\tОшибка при открытии файла"<<endl<<endl;
            return;
        }
        T.SaveInFile (T.GetRoot(), Base);
        fclose (Base);
        cout<<endl<<endl<<"\t\tФайл записан успешно!"<<endl;
        break;
    case '2':           //если новый файл
        system ("cls");         
        cout<<endl<<"\tВведите имя файла: ";
        gets_s (buffer);
        strcat (buffer, ".txt");
        if (!(Base = fopen (buffer, "w")))
        {
            cout<<endl<<endl<<"\tОшибка при открытии файла"<<endl;
            return;
        }
        T.SaveInFile (T.GetRoot(), Base);
        fclose (Base);
        cout<<endl<<endl<<"\t\tФайл записан успешно!"<<endl;
        break;
    }
}


И соответствующая функция ReadBase:
Кликните здесь для просмотра всего текста

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
void  ReadBase (Tree &T)        //чтение базы из файла
{
    FILE *Base;
    char buffer [200];
    if (T.GetRoot ())
        T.Del ();
    system ("cls");         
    cout<<endl<<"\tВведите путь или имя файла: ";
    gets_s (buffer);
    strcat (buffer, ".txt");
    if(_access(buffer, 00) == -1)
    {
        cout<<endl<<"\tУказан неверный путь или имя файла"<<endl;
        return;
    }
        
    if (!(Base = fopen (buffer, "r")))
    {
        cout<<endl<<endl<<"\tОшибка при открытии файла"<<endl<<endl;
        return;
    }
    
    T.ReadOutFile (Base);
    fclose (Base);
    cout<<endl<<endl<<"\t\tФайл считан успешно!"<<endl;
    
}


Проблема в том, что, когда я считываю последовательно записи из файла, нужно же закончить чтение, что обычно делается командой feof вот как здесь:

C++
1
2
3
4
5
6
while (!feof (F))
    {
        Subscriber *Node = new Subscriber;
        fread (Node, sizeof (Subscriber), 1, F);
        Insert (Node);
    }
Но, дело в том, что данные в файл записываются абсолютно все, то есть вместе с неиспользованными байтами из символьных массивов FIO, Town, Number. И в итоге после чтения всей нужной инфы, он вконце дописывает весь остальной мусор из файла. Ну вот пример.
1) Ввожу инфу:

Запись и чтение структуры в/из файла

2) Вывожу на экран:

Запись и чтение структуры в/из файла

3) Сохраняю в файл:

Запись и чтение структуры в/из файла

4) Считываю из файла:

Запись и чтение структуры в/из файла

5) Вывожу считанную информацию на экран:

Запись и чтение структуры в/из файла

В общем я понимаю причину, но не могу сообразить, как сделать, чтобы считывалось всё, без мусора. Записывать и считывать построчно путём fputs() и fgets() как то глупо и накладно как по мне :/ Может я как-то неверно описал функции записи и чтения?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru