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

Считать массив структур из файла - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.83
nikola_omsk
3 / 3 / 0
Регистрация: 27.05.2011
Сообщений: 73
11.10.2012, 16:26     Считать массив структур из файла #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
//создание файла-записи
#include<iostream>
#include<conio.h>
#include<stdio.h>
using namespace std;
 
//Стpуктуpа данных
struct CD {
char name[20];
char adres [20];
char sur[20];
int kol;
int year;
float price;
 
};
 
 
CD mas[5]; //массив типа структуры
 
Пpоцедуpа ввода в базу
CD inbase(CD cd)
{
cout<<"Name "<< endl;
cin>>cd.name;
cout<<"VidbI sporta "<< endl;
cin>>cd.sur;
cout<<"Vmestimostb: "<< endl;
cin>>cd.kol;
cout<<"God: "<< endl;
cin>>cd.year;
cout<<"Kol-vo"<< endl;
cin>>cd.price;
cout<<"Adress " <<endl;;
cin>>cd.adres;
cout <<endl<<endl<<endl;;
return cd; //функция возвpащает заполненную стpуктуpу
}
 
//Пpоцедуpа ввода в базу
void finbase(FILE *f, CD cd)
{
 
fprintf(f, "%s ", cd.name);
fprintf(f, "%s ", cd.sur);
fprintf(f, "%s ", cd.adres);
fprintf(f, "%d ", cd.kol);
fprintf(f, "%d ", cd.year);
fprintf(f, "%f ", cd.price);
 
 
}
 
 
//Вывод массива из файла
void foutmas(char namez,FILE *f, CD cd)
{
 
//Считываем значение из файла
fscanf(f, "%s", cd.name);
if (*cd.name==namez) {
cout<<"Name: "<<cd.name<< endl;
fscanf(f, "%s", cd.sur);
cout<<"VidbI sporta: "<<cd.sur<< endl;
fscanf(f, "%f", cd.kol);
cout<<"Vmestimostb: "<<cd.kol<< endl;
fscanf(f, "%f", cd.year);
cout<<"God: "<<cd.year<< endl;
fscanf(f, "%d", cd.price);
cout<<"Kol-vo: "<<cd.price<< endl;
fscanf(f, "%s", cd.adres);
cout<<"Adres: "<<cd.adres<< endl;
}
}
 
 
int main()
{
CD c; //Экземпляp стpуктуpы CD
int i=0;
char name;
 
FILE *f=fopen("data.txt", "w+"); //Создаем файл
 
do {
mas[i]=inbase(c); //Заполняем элемент массив
finbase(f, mas[i]); //Записываем элемент в файл
i++;
fseek(f, 1, SEEK_CUR); //Пеpеходим на в файле на один символ
}while(i<2);
 
 
i=0; //Обнуляем пеpеменную цикла
 
printf("Nazhmite klavishy dlya vbIvoda ...\n");
cout <<endl<<endl<<endl;;
cout <<endl<<endl<<endl;;
cout <<"vvedite im9 dl9 vbIvoda";
cin >>name;
do {
foutmas(name,f, mas[i]); //Считываем массив из файла и выводим на экpан, вызов функции
i++;
cout <<endl<<endl<<endl;;
}while(i<2);
 
fclose(f); //Закpываем файл
return 0; //Пpизнак удачного завеpшения пpогpаммы
}
Здесь масив заполняется вручную...как переделать чтобы он считывался с файла...подскажите

Добавлено через 3 минуты
задача такая:дан динамический массив структур в файле...мы вписываем имя (чего то там) и он выводит структуру к этому имени...то есть пишем стадион 1---выводит все данные о нем...

Добавлено через 52 минуты
Нужно изменить finbase?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,208
Записей в блоге: 11
11.10.2012, 16:37     Считать массив структур из файла #2
Файл бинарный или текстовый?
nikola_omsk
3 / 3 / 0
Регистрация: 27.05.2011
Сообщений: 73
11.10.2012, 20:35  [ТС]     Считать массив структур из файла #3
текстовый

Добавлено через 2 часа 22 минуты
?какие варианты

Добавлено через 1 час 8 минут
Как вместо вписывания в программе данных структуры, считать ее из файла
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define BUF_LEN 64
#define SEP "----------------------------------------------------------------------"
 
typedef struct MOVE {
    char title[BUF_LEN];
    char director[BUF_LEN];
    int year;
    double cost;
    double income;
} move_t;
 
/* возвращает индекс в массиве или size, если не найдено */
size_t searchByTitle(const char *title, const move_t *arr, size_t size){
    size_t i;
    for ( i = 0; i < size && strcmp(title, arr[i].title); ++i )
        ;
    return i;
}
 
 
void prnArray(const move_t *arr, size_t size){
    size_t i;
    printf("\n%s\nName               Sport                YEAR   COST  Kol\n%s\n", SEP, SEP);
    for ( i = 0; i < size; ++i )
        printf("%-20s%-20s%-6d%-6.1f%-8.1f\n", arr[i].title, arr[i].director, arr[i].year, arr[i].cost, arr[i].income);
    printf("%s\n", SEP);
}
 
int menuMsg(){
    int ret;
    printf("\nChoice one:\n1 - Show all\n2 - Find by title\n3  - exit\n> ");
    if ( scanf("%d%*c", &ret) != 1 )
        return -1;
    return ret;
}
 
#define SIZE 7
int main(void){
    move_t arr[SIZE] = {
        {"Avatar", "James Kemeron", 2010, 600.0, 7000000.0},
        {"Titanik", "James Kemeron", 1997, 500.0, 5500000.0},
        {"Edje of Darkness", "Martin Campbell", 2010, 200.0, 1200000.0},
        {"Peacoc", "Mikl Lander", 2010, 350.0, 800000.0},
        {"Casino Royale", "Martin Campbell", 2006, 700.0, 5000000.0},
        {"Halloween", "Rom Zombi", 2007, 125.0, 1000000.0},
        {"The Others", "Alejandro Amenabar", 2001, 660.0, 1250000.0}
    };
    int menu, found;
    char buf[BUF_LEN], *p;
    double lr, hr;
 
    while ( 1 ){
        menu = menuMsg();
        switch ( menu ){
            case 1 :
                prnArray(arr, SIZE);
                break;
            case 2 :
                printf("Title: ");
                if ( !fgets(buf, BUF_LEN, stdin) )
                    exit(1);
                if ( p = strrchr(buf, '\n') )
                    *p = '\0';
                if ( !*buf )
                    break;
                if ( ( found = searchByTitle(buf, arr, SIZE) ) == SIZE )
                    printf("***Not found!\n");
                else
                    prnArray(&arr[found], 1);
                break;
 
 
            case 0 :
                exit(0);
            default :
                printf("Wrong menu index!\n");
        }
    }
    exit(0);
}
Добавлено через 4 минуты
и сделать arr динамическим

Добавлено через 9 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
#define SIZE 7
int main(void)
{   char *move_t =new char [SIZE];
    move_t arr[SIZE] = {
        {"Avatar", "James Kemeron", 2010, 600.0, 7000000.0},
        {"Titanik", "James Kemeron", 1997, 500.0, 5500000.0},
        {"Edje of Darkness", "Martin Campbell", 2010, 200.0, 1200000.0},
        {"Peacoc", "Mikl Lander", 2010, 350.0, 800000.0},
        {"Casino Royale", "Martin Campbell", 2006, 700.0, 5000000.0},
        {"Halloween", "Rom Zombi", 2007, 125.0, 1000000.0},
        {"The Others", "Alejandro Amenabar", 2001, 660.0, 1250000.0}
    };
чего то намудрил...как выделить тут память

Добавлено через 6 минут
кто нибудь.....
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,208
Записей в блоге: 11
11.10.2012, 20:39     Считать массив структур из файла #4
Если бы файл был бинарный, то можно было бы считать весь массив за один раз.
Динамическое выделение памяти
C++ (Qt)
1
2
//...
move_t* array = new move_t[SIZE]
Но если не хочешь потом освобождать память, то используй std::vector
C++ (Qt)
1
2
//...
std::vector<move_t> array(SIZE);
nikola_omsk
3 / 3 / 0
Регистрация: 27.05.2011
Сообщений: 73
11.10.2012, 20:55  [ТС]     Считать массив структур из файла #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
std::string filePath("file.binary");
        std::fstream fs;
fs.open(filePath.c_str(), std::ios::out | std::ios::binary);
 if(!fs.is_open()) throw std::runtime_error("Unable to open output file");
fs.open(filePath.c_str(), std::ios::in | std::ios::binary);
        if(!fs.is_open()) throw std::runtime_error("Unable to open input file");
        std::list<int> list;
for(int n; !fs.read(reinterpret_cast<char*>(&n), sizeof(n)).fail(); list.push_back(n))
        ;
        fs.clear();
        if(fs.gcount()) throw std::runtime_error("read failed");
        fs.close();
что то типо этого...а как в массив структур засунуть..

Добавлено через 4 минуты
хотя врятли подойдет...у нас не было этой темы...
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,208
Записей в блоге: 11
11.10.2012, 21:05     Считать массив структур из файла #6
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#pragma pack (push, 1) //защита от выравнивания адресов
struct MOVE {
    char title[BUF_LEN];
    char director[BUF_LEN];
    int year;
    double cost;
    double income;
} 
#pragma pack ( pop )
 
//....
MOVE array[SIZE];
//....
fs.read(reinterpret_cast<char*>(array), SIZE*sizeof(array[0)); // чтение
//...
fs.write(reinterpret_cast<char*>(array), SIZE*sizeof(array[0)); // запись
//...
std::vector<MOVE> vec(SIZE)
//....
fs.read(reinterpret_cast<char*>(&vec[0]), SIZE*sizeof(vec[0]); // чтение
//...
fs.write(reinterpret_cast<char*>(&vec[0]), SIZE*sizeof(vec[0]); // запись
nikola_omsk
3 / 3 / 0
Регистрация: 27.05.2011
Сообщений: 73
11.10.2012, 21:17  [ТС]     Считать массив структур из файла #7
C++
1
2
3
4
std::vector<move_t> array(SIZE);
FILE *fp = fopen("my_file.txt","wb");
fp = fopen("my_file.txt","rb");
fp.read(reinterpret_cast<char*>(array), SIZE*sizeof(array[0]);
чего то я насочинял....
дальше вместо arr можно использовать move_t???
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,208
Записей в блоге: 11
11.10.2012, 21:19     Считать массив структур из файла #8
Можно. Зато так не надо помнить какого типа элементы.
nikola_omsk
3 / 3 / 0
Регистрация: 27.05.2011
Сообщений: 73
11.10.2012, 21:23  [ТС]     Считать массив структур из файла #9
: request for member 'read' in 'fp', which is of non-class type 'FILE*'|
:\21211\main.cpp|48|error: invalid cast from type 'std::vector<MOVE, std::allocator<MOVE> >' to type 'char*'|
в строчке чтения выдаеть
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,208
Записей в блоге: 11
11.10.2012, 21:34     Считать массив структур из файла #10
fp не является классом.
C++ (Qt)
1
2
3
std::ifstream input("my_file.txt", std::iod::binary);
input.read(reinterpret_cast<char*>(array), SIZE*sizeof(array[0]);
input.clost();
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2012, 00:30     Считать массив структур из файла
Еще ссылки по теме:

C++ Массив структур из файла
Как считать массив структур из файла txt C++
Считать из бинарного файла в массив структур фамилию, имя, оценку по математике, оценку по информатике C++

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

Или воспользуйтесь поиском по форуму:
nikola_omsk
3 / 3 / 0
Регистрация: 27.05.2011
Сообщений: 73
12.10.2012, 00:30  [ТС]     Считать массив структур из файла #11
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
int main(void)
{
move_t* array = new move_t[SIZE];
std::ifstream input("my_file.txt", std::ios::binary);
input.read(reinterpret_cast<char*>(array), SIZE*sizeof(array[0]));
input.close();
 
    int menu, found;
    char buf[BUF_LEN], *p;
 
 
    while ( 1 ){
        menu = menuMsg();
        switch ( menu ){
            case 1 :
                prnArray(move_t, SIZE); //error: expected primary-expression before ',' token|
                break;
            case 2 :
                printf("Title: ");
                if ( !fgets(buf, BUF_LEN, stdin) )
                    exit(1);
                if ( p = strrchr(buf, '\n') )
                    *p = '\0';
                if ( !*buf )
                    break;
                if ( ( found = searchByTitle(buf, move_t, SIZE) ) == SIZE ) //error: expected primary-expression before ',' token|
                    printf("***Not found!\n");
                else
                    prnArray(&move_t[found],1); //error: expected primary-expression before '[' token|
                break;
 
 
            case 0 :
                exit(0);
            default :
                printf("Wrong menu index!\n");
        }
    }
 
    exit(0);
}
с чтением вроде норм...если не сложно...подскажите где ошибся...
никогда не работал с бинарными файлами...как его задавать?

Добавлено через 5 минут
заменил на array в функциях...ошибка исчезла

Добавлено через 16 минут
как создать пример файла для этой программы
C++ (Qt)
1
2
3
4
5
6
  
   char title[BUF_LEN];
    char director[BUF_LEN];
    int year;
    double cost;
    double income;
хотя бы чтобы там было 3 таких структуры с разными значениями

Добавлено через 2 часа 15 минут
решил все таки текстовым...всем спасибо...больше не будет прог на си++...
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>
#define BUF_LEN 64
#define SEP "----------------------------------------------------------------------"
using namespace std;
typedef struct MOVE {
    char title[20];
    char director[20];
    int year;
    int cost;
    int income;
} move_t;
 
/* возвращает индекс в массиве или size, если не найдено */
size_t searchByTitle(const char *title, const move_t *arr, size_t size){
    size_t i;
    for ( i = 0; i < size && strcmp(title, arr[i].title); ++i )
        ;
    return i;
}
 
 
void prnArray(const move_t *arr, size_t size){
    size_t i;
    printf("\n%s\nName               Sport                YEAR   COST Kol\n%s\n", SEP, SEP);
    for ( i = 0; i < size; ++i )
        printf("%-20s%-20s%-6d%-6.1d%-8.1d\n", arr[i].title, arr[i].director, arr[i].year, arr[i].cost, arr[i].income);
    printf("%s\n", SEP);
}
 
int menuMsg(){
    int ret;
    printf("\nChoice one:\n1 - Show all\n2 - Find by title\n0  - exit\n> ");
    if ( scanf("%d%*c", &ret) != 1 )
        return -1;
    return ret;
}
 
#define SIZE 3
move_t* array = new move_t[SIZE];
 
 
int main(void){
 
 
   FILE *f=fopen("1.txt", "r+"); //Создаем файл
   for  (int i=0;i<SIZE;++i)
   {fscanf(f, "%s",&(array[i].title ));
fscanf(f, "%s", &(array[i].director));
fscanf(f, "%d", &(array[i].income));
fscanf(f, "%d", &(array[i].cost));
fscanf(f, "%d", &(array[i].year));
 
 
 
   }
    int menu, found;
    char buf[BUF_LEN], *p;
    double lr, hr;
 
    while ( 1 ){
        menu = menuMsg();
        switch ( menu ){
            case 1 :
                prnArray(array, SIZE);
                break;
            case 2 :
                printf("Title: ");
                if ( !fgets(buf, BUF_LEN, stdin) )
                    exit(1);
                if ( p = strrchr(buf, '\n') )
                    *p = '\0';
                if ( !*buf )
                    break;
                if ( ( found = searchByTitle(buf, array, SIZE) ) == SIZE )
                    printf("***Not found!\n");
                else
                    prnArray(&array[found], 1);
                break;
 
 
            case 0 :
                exit(0);
            default :
                printf("Wrong menu index!\n");
        }
    }
    delete[]array;
 
    exit(0);
}
Yandex
Объявления
12.10.2012, 00:30     Считать массив структур из файла
Ответ Создать тему
Опции темы

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