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

Ansi c, запись и чтение структуры из файла. Накосячил от души - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ В массиве A(n) удалить все отрицательные числа ,затем массив упорядочить по убыванию http://www.cyberforum.ru/cpp-beginners/thread915404.html
В массиве A(n) удалить все отрицательные числа ,затем массив упорядочить по убыванию.
C++ Написать программу, которая вводит с клавиатуры одномерный массив из 5 дробных чисел, после чего выводит кол-во ненулевых элементов Написать программу, которая вводит с клавиатуры одномерный массив из 5 дробных чисел, после чего выводит кол-во ненулевых элементов. Перед вводом каждого элемента должна выводиться подсказка с... http://www.cyberforum.ru/cpp-beginners/thread915399.html
Как создать генератор случайных символов? C++
Может уже есть реализация? =)
Циклические алгоритмы. Вычислить значение C++
Два числа, действительное х и натуральное n>=10, вводятся с клавиатуры. Вычислить значение: sin(x)+ sin^2(x)+ sin^3(x)+ sin^4(x)+...+sin^n(x)
C++ Что не так в коде? Алгоритм транспонирования. http://www.cyberforum.ru/cpp-beginners/thread915364.html
Что не так в коде? Я хочу транспонировать массив 3 на 3. в итоге выводит те же самые введенные данные. Может не правильный алгоритм транспонирования #include <iostream> using namespace std; ...
C++ CUDA: максимальное число Blocks per Grid Проблема вот в чём: не нашёл функцию, которая бы в CUDA-программе указывала максимальное число блоков в сетке. Используя cudaGetDeviceProperties(cudaDeviceProp* data, int device), в структуре... подробнее

Показать сообщение отдельно
Yn94k0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
01.07.2013, 03:32  [ТС]
очень странно, сейчас попробовал свой старый вариант (тот, что с циклом и реаллоцированием) замутить, с помощью точек останова выяснил, что он как бы правильные значения из файла считывает, но потом удаляет, когда закончивается выполнение функции "read". Удивительно. И size принимает какие-то уж совсем странные значения.

Код:
data.h
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>// ПОдключение библиотек
#include <stdlib.h>
#include <locale.h>
#include <limits.h>
#include <conio.h>
/**@file data.h*/
/*Структура данных "Прокат"*/
#ifndef DATA_H
#define DATA_H
struct rent
{   
    char name[15];/*<имя клиента*/
    char m_name[15];/*<название арендуемой машины*/
    int rent_per_mounth;/*<рента*/
    int nom;/*<количество месяцев*/
    char number[10];/*<номер машины*/
    int summ;/*<доход компании от клиента*/
};
#endif DATA_H
type.h
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
/**@file type.h*/
#include "data.h"
#ifndef TYPE_H//условная компиляций 
#define TYPE_H
//Ввод данных
int enter(rent *&mas, int size);
/**ref Enter_show.cpp*/
//Вывод данных
int show(rent *&mas,int size);
/**ref Enter_show.cpp*/
//Чтение из файла 
int read(rent *&mas,int size);
/**ref read_write.cpp*/
//Запись в файл
int write(rent *mas,int size);
/**ref read_write.cpp*/
//Удаление данных
int delet(rent *&mas,int size);
/**ref delet_proc.cpp*/
//Комплект меню
int menu1();
/**ref menu.cpp*/
//Меню выбора сортировок
int menu_sort(rent *&mas,int size);
/**ref menu.cpp*/
//Функция поиска даных
int find(rent *mas,int size);
/**ref delet_proc.cpp*/
//Сортировка пузырька
void sort_puz(rent *&mas,int size);
/**ref sort.cpp*/
//Сортировка шелла
void sort_shell(rent *&mas,int size);
/**ref sort.cpp*/
// Быстрая Сортировка
void quick_sort(rent *&mas,int first, int end);
/**ref sort.cpp*/
//Основная программа 
void programm();
/**ref display.cpp*/
#endif TYPE_H
файл исходного кода main.cpp
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 "type.h"
void main()
{
    int size=0;
    bool key = false;
    rent *mas=NULL;
    mas = (rent *)malloc(sizeof(rent));
    do
    {
        system("cls");//очистака экрана
        menu1();//вывод меню
        switch(_getch())
            {
                case '\x5':system("cls");
                size = enter(mas, size);
                break;//выбор Пункта меню 
                
                case '\x16':system("cls");
                show(mas,size);
                _getch();break;
 
                case '\x13':system("cls");
                write(mas,size);
                _getch();break;
 
                case '\x12':system("cls");
                read(mas,size);
                _getch();break;
 
                case '\x4':system("cls");
                size = delet(mas,size);
                _getch();break;
 
                case '\x6':system("cls");
                find(mas,size);
                _getch();break;
 
                case '\f':system("cls");
                menu_sort(mas,size);
                _getch();break;
 
                case '\x11':system("cls");key = true ;break;
            }
    }while(key!= true);
}
ресурсы:
search_del
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
#include "type.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
int delet(rent *&mas,int size)//функция удаления 
{
    int number;
    printf("Enter number of record\n");
    scanf("%d", &number);
    for (int i = number; i < size; i++)
    {
            mas[i-1]=mas[i];//удаление 
            strcpy(mas[i].name, " ");
            strcpy(mas[i].m_name, " ");
            strcpy(mas[i].number, " ");
            mas[i].rent_per_mounth=0;
            mas[i].nom=0;
            mas[i].summ=0;
        }
    size--;//уменьшение размерности
    return size;//возврат значения 
}
int find(rent *mas,int size)//функция поиска 
{
    char S[60]; 
    printf("Enter client`s name for search : ");
    gets(S);
    for(int i=0;i<size;i++)//цикл поиска
        {
            if(strcmp(S, mas[i].name)==0)//условие поиска 
                {
                    printf("\tName\t\tMachine`s name  Per mouth  Duration\tNumber  Summ\n\n");//шапка таблицы 
                    printf("%16s",mas[i].name);
                    printf("%16s\t  ",mas[i].m_name);
                    printf("%d\t",mas[i].rent_per_mounth);
                    printf("%d\t",mas[i].nom);
                    printf("%7s  ",mas[i].number);
                    printf("%d\n",mas[i].summ);
                    return 0;//удачное завершение 
                }
    else
    {
    printf("\t\t\t\tThere`s no enties\n");//вывод сообщение 
    return 1;//ошибочное завршение 
    }
        }
}
enter_show
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
#include "type.h"
 
int enter(rent *&mas, int size)//функция ввода 
{
    int hm=0;
    printf("Enter number of client : ");
    scanf("%d",&hm);//ввод кол - во записей
    _flushall();//очистка буфера ввода
 
    size=size+hm;
    mas = (rent *)realloc(mas, size * sizeof(struct rent));
 
    for(int i=(size-hm);i<(size);i++)//цикл по вводу 
        {
            system("cls");
            printf("Enter name of client:");
            gets(mas[i].name);
            _flushall();
            printf("Enter name of machine:");
            gets(mas[i].m_name);
            _flushall();
            printf("Enter rent per mounth:");
            scanf("%d",&mas[i].rent_per_mounth);
            _flushall();
            printf("Enter number of mounth:");
            scanf("%d",&mas[i].nom);
            _flushall();
            printf("Enter number of machine:");
            gets(mas[i].number);
            mas[i].summ = mas[i].nom  * mas[i].rent_per_mounth;
        }
    return size;//возврат значения 
}
int show(rent*&mas,int size)//функция вывода 
{
    printf("\tName\t\tMachine`s name  Per mouth  Duration\tNumber  Summ\n\n");//шапка таблицы 
    for (int i=0;i<size;i++)
        {   
            printf("%16s",mas[i].name);
            printf("%16s\t  ",mas[i].m_name);
            printf("%d\t",mas[i].rent_per_mounth);
            printf("%d\t",mas[i].nom);
            printf("%7s  ",mas[i].number);
            printf("%d\n",mas[i].summ);
        }
    printf("\n\n");
    return 0;
}
menu
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
#include "type.h"
//Реализация функций отображение на экране
int menu1()
{
    printf("\t\t\t\tRent\n\t\t\t\tPress\n\n\n");
    printf("Ctr+e enter ");
    printf("Ctr+v view ");
    printf("Ctr+s.save ");
    printf("Ctr+r read ");
    printf("Ctr+d.del ");
    printf("Ctr+f search ");
    printf("Ctr+l sort ");
    printf("Ctr+q esc");
    return 0;
}
int menu_sort(rent *&mas,int size)
{
    printf("1.Bubble sort | 2.Shell`s sort | 3.Fast sort\n\n");
    switch(_getch())
        {
            case 49:system("cls");sort_puz(mas,size);_getch();break;
            case 50:system("cls");sort_shell(mas,size);_getch();break;
            case 51:system("cls");quick_sort(mas,0,size-1);_getch();break;
        }
    return 0;
}
read_write
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
#include "type.h"
#include <io.h>
int write(rent *mas,int size)// фукция записи 
{
    FILE *fp = fopen("file.dat","w");//создание файла для записи 
    if(!fp)// проверка на открытие 
        {
            printf("FILE NOT FOUND\n");// ошибка если не открылся 
            return 1;
        }
            fwrite (mas, sizeof(struct rent), size, fp);
    printf("\t\t\t\tFile was saved\n");//вывод сообщения 
    fclose(fp);// закрытие файла 
    return 0;
}
 
 
 
int read(rent *&mas,int size)//функция чтения 
{
    FILE *fp = fopen("file.dat","r");//открытие файла 
    if(!fp)// проверка открытия 
        {
            printf("FILE NOT FOUND\n");//ошибка 
            return 1;
        }
    while (!feof(fp)) //цикл по чтению
        {
            size++;
            mas = (rent *)realloc(mas, size * sizeof(struct rent));
            fread(mas, sizeof(struct rent), 1, fp);
        }
 
    printf("\t\t\t\tFile was read\n");//вывод сообщения 
    fclose(fp);//закрытие файла 
    return size;
}
sort

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
#include "type.h"
void sort_puz(rent *&mas,int size)//функция сортировки 
{
    rent key;
    for(int i=0;i<size;i++)//циклы по перебору 
        for(int j=0;j<size-1;j++)
            {
                if(mas[i].summ>mas[j].summ)//условие сравнения 
                    {
                        key=mas[i];//объмен элементами 
                        mas[i]=mas[j];
                        mas[j]=key;
                    }
            }
    show(mas,size);//вызов функции вывода 
}
void sort_shell(rent *&mas,int size)
{
    int d,i,j;
    rent key;
    d=size;//шаг сортировки 
    while (d>1)
    {
        i=0;
        d=d/2;
        while ((j=i+d)<size)//проверка разделенных массивов
            {
                if (mas[j].summ>mas[i].summ)//сравнение и обмен
                 {
                     key=mas[i];
                     mas[i]=mas[j];
                     mas[j]=key;
                 }
             i++;
            }
    }
    show(mas,size);//вызов функции вывода 
}
void quick_sort(rent *&mas,int first,int end)
{
    rent key,k;
    int i=first,j=end;
    k.summ = mas[(first+end)/2].summ;//нахождение центрального элемента
    do  {
        while (mas[i].summ<k.summ)i++;//проход по элементам 
        while (mas[j].summ>k.summ)j--;          
                if (i<=j)
                    { 
                        if (i<j)
                        {
                            key=mas[j];//обмен 
                            mas[j]=mas[i];
                            mas[i]=key; 
                        }
                    i++;
                    j--;
                    }
             
      }while (i<=j);//условие завершения цикла 
    if (i<end) //вызов рекурсии
        {
            quick_sort(mas,i,end);//рекурсия 
        }
    if (first<j)  
        {
            quick_sort(mas,first,j);
        }
    show(mas,end+1);//вызов функции вывода 
}
прошу прощение за большое количество кода, едва ли приятно кому-то в нём копаться, посему и не стал скидывать. Я уже из-за спортивного интереса отказываться не хочу от старого варианта.
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru