Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/55: Рейтинг темы: голосов - 55, средняя оценка - 4.95
3 / 3 / 0
Регистрация: 27.05.2011
Сообщений: 73

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

11.10.2012, 16:26. Показов 11672. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.10.2012, 16:26
Ответы с готовыми решениями:

Считать с файла в массив структур
Всем привет, у меня есть структура, сделала корректный ввод в файл как теперь считать с файла в массив структур? typedef struct { ...

Считать массив структур из файла
Видела похожие темы, но так и не дошло:( В общем, количество структур в файле мне известно. Нужно считать их в массив. Проблема в том,...

Считать из файла массив структур
Помогите пожалуйста. Есть функция caseone(), предназначение которой считать из файла массив объектов структуры(название книги, автора,...

10
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
11.10.2012, 16:37
Файл бинарный или текстовый?
0
3 / 3 / 0
Регистрация: 27.05.2011
Сообщений: 73
11.10.2012, 20:35  [ТС]
текстовый

Добавлено через 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 минут
кто нибудь.....
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
11.10.2012, 20:39
Если бы файл был бинарный, то можно было бы считать весь массив за один раз.
Динамическое выделение памяти
C++ (Qt)
1
2
//...
move_t* array = new move_t[SIZE]
Но если не хочешь потом освобождать память, то используй std::vector
C++ (Qt)
1
2
//...
std::vector<move_t> array(SIZE);
1
3 / 3 / 0
Регистрация: 27.05.2011
Сообщений: 73
11.10.2012, 20:55  [ТС]
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 минуты
хотя врятли подойдет...у нас не было этой темы...
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
11.10.2012, 21:05
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]); // запись
0
3 / 3 / 0
Регистрация: 27.05.2011
Сообщений: 73
11.10.2012, 21:17  [ТС]
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???
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
11.10.2012, 21:19
Можно. Зато так не надо помнить какого типа элементы.
0
3 / 3 / 0
Регистрация: 27.05.2011
Сообщений: 73
11.10.2012, 21:23  [ТС]
: 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*'|
в строчке чтения выдаеть
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
11.10.2012, 21:34
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();
0
3 / 3 / 0
Регистрация: 27.05.2011
Сообщений: 73
12.10.2012, 00:30  [ТС]
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);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.10.2012, 00:30
Помогаю со студенческими работами здесь

Считать массив структур из файла
Доброго времени суток, мне нужно считать данные из файла в массив структур, вот мой код - узнаю длину файла(количество строк) и потом...

Как считать массив структур из файла txt
#include &quot;stdafx.h&quot; #include &lt;fstream&gt; #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; struct slug { char...

Считать из бинарного файла в массив структур фамилию, имя, оценку по математике, оценку по информатике
необходимо считать из бинарного файла в массив структур фамилию, имя, оценку по математике, оценку по информатике, оценку по физике

Считать массив структур из файла
Кто-нибудь знает как правильно считать данный массив структур из файла? struct TRAIN { char* dest; char* trnum; ...

Считать данные в коллекцию структур из текстового файла. Выполнить сортировку коллекции с использованием Linq-запросов
Создать проект Windows Form. Описать структуру согласно заданию. Считать данные в коллекцию структур из текстового файла(не менее 15...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru