С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.83
CoRoBOK
0 / 0 / 0
Регистрация: 14.03.2009
Сообщений: 23
#1

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

05.04.2009, 14:29. Просмотров 2343. Ответов 16
Метки нет (Все метки)

Здравствуйте. Мне нужно составить программу. Я написал, часть программы, мне нужно производить чтение и запись в файл (в самом файле должно быть несколько примеров, в форме структуры (наименование фирмы, количество продаж, той или иной продукции)) у меня предлагается выбор "1 запись" и "2 чтение из файла" но я не знаю как мне в этот файл заранее внести данные, что бы произвести чтение послудующее, файл создался, но он пустой. Что делать, подскажите?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2009, 14:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Запись и чтение из файла. Структура. Сортировка (C++):

Структура. Чтение файла. Функция strcmp - C++
Код программы. #include <stdio.h> #include <iostream> #include <string.h> using namespace std; struct STADION{char *name;char...

Возращение количества байт. Структура и чтение с файла - C++
Проверяет и не хочет ничего выводить. В чем проблема? while(1) { if(sizeof(inf) != fread(&inf, sizeof(inf),1,f)) break; ...

Структура, запись из файла в массив - C++
Всем привет, очень нуждаюсь в вашей помощи делаю лабу #include<stdio.h> #include<conio.h> #include<iostream.h> #include...

Запись и чтение структуры из файлов, сортировка по полю - C++
у меня есть 2 проги в одной создается файл а в другой обработка #include <cstdio> const char fileName =...

Функции и файлы. Чтение и запись данных в файл. Структура "Ноутбук" - C++
Приветствую. Помогите, пожалуйста, с программой. Для хранения данных о ноутбуках описать структуру вида: struct NOTEBOOK{ struct...

Запись и чтение с файла - C++
Подскажите пожалуйста как правильно записать массив в файл и считать его оттуда в другой массив? Если можно пример кода не в чистом с,а...

16
Gravity
564 / 558 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
05.04.2009, 14:52 #2
Пиши в файл fprintf'ом данные структуры, читай из файла через fgets (может еще понадобится fscanf). Лучше выкладывай код чего и куда нужно записывать/читать, так всем будет понятнее.
0
CoRoBOK
0 / 0 / 0
Регистрация: 14.03.2009
Сообщений: 23
05.04.2009, 14:59  [ТС] #3
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
#include <stdio.h>
#include <string.h>
#include <conio.h>
int num_firm, total,i,n;
char ukaz;
main()
{
struct firm
{ char name[100];
  double medic;
  double industry;
  double food;
};
clrscr();
firm st[100];
FILE *data;
data=fopen("data.dat","w");
printf(" Nagmite 1 dlya zapolnenia dannuh \n");
printf(" Nagmite 2 dlya zagryzki dannuh \n");
scanf("%c", ukaz);
if(ukaz=='1')
{
data=fopen("data.dat","w");
    for (i=0;i<3;i++)
{
printf("Vvedite nazvanie firm ");
scanf("%s", & (st[i].name));
printf("Vvedite kol-vo medicinskoi produkcii ");
scanf("%f", &(st[i].medic));
printf("Vvedite kol-vo promushlennoi produkcii ");
scanf("%f", &(st[i].industry));
printf("Vvedite kol-vo pishevoi produkcii ");
scanf("%f", &(st[i].food));
fwrite(&st[i],sizeof(st[i]),1,data);
}
if (ukaz=='2')
{
data=fopen("data.dat","r");
for(i=0;i<3;i++)
{
fread(&st[i],sizeof(firm),1,data);
printf("%s", st[i].name);
printf("%f", st[i].medic);
printf("%f", st[i].industry);
printf("%f", st[i].food);
}
}
}
}
Вот собственно, что я написал. Посмотрите, там чтение не произвести и запись в файл.
0
Gravity
564 / 558 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
05.04.2009, 15:33 #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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <stdio.h>
#include <conio.h>
 
#define MAXLINE 80
struct firm {
    char name[100];
    double medic;
    double industry;
    double food;
} st[100];
 
main()
{
    int num_firm, total, i, n;
    char ukaz, line[MAXLINE];
    FILE *data;
    
    printf(" Nagmite 1 dlya zapolnenia dannuh \n");
    printf(" Nagmite 2 dlya zagryzki dannuh \n");
    scanf("%c", &ukaz);
    
    if(ukaz=='1') {
        data = fopen("data.txt","w");
        for (i=0; i<3; i++) {
            printf("Vvedite nazvanie firm ");
            scanf("%s", st[i].name);
            
            printf("Vvedite kol-vo medicinskoi produkcii ");
            scanf("%lf", &st[i].medic);
            
            printf("Vvedite kol-vo promushlennoi produkcii ");
            scanf("%lf", &st[i].industry);
            
            printf("Vvedite kol-vo pishevoi produkcii ");
            scanf("%lf", &st[i].food);
            
            fprintf(data, "%s %lf %lf %lf\n",
                          st[i].name, st[i].medic, st[i].industry, st[i].food);
            
        }
        fclose(data);
    }
    else if (ukaz=='2') {
        data = fopen("data.txt", "r");
        for(i=0; i<3; i++) {
            fgets(line, MAXLINE, data);
            sscanf(line, "%s %lf %lf %lf", st[i].name, &st[i].medic, &st[i].industry, &st[i].food);
            printf("%s %lf %lf %lf\n", st[i].name, st[i].medic, st[i].industry, st[i].food);
        }
        fclose(data);
    }
    getch();
    return 0;
}
1
CoRoBOK
0 / 0 / 0
Регистрация: 14.03.2009
Сообщений: 23
05.04.2009, 17:09  [ТС] #5
После ввода названия фирмы появляется ошибка...

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
#include <stdio.h>
#include <string.h>
#include <conio.h>
int num_firm, total,i,n;
char ukaz;
main()
{
struct firm
{ char name[100];
  double medic;
  double industry;
  double food;
};
clrscr();
firm st[100];
FILE *data;
data=fopen("data.dat","w");
printf(" Nagmite 1 dlya zapolnenia dannuh \n");
printf(" Nagmite 2 dlya zagryzki dannuh \n");
scanf("%c",&ukaz);
if(ukaz=='1')
{
data=fopen("data.txt","w");
    for (i=0;i<3;i++)
{
printf("Vvedite nazvanie firm ");
scanf("%s", & (st[i].name));
printf("Vvedite kol-vo medicinskoi produkcii ");
scanf("%f", &(st[i].medic));
printf("Vvedite kol-vo promushlennoi produkcii ");
scanf("%f", &(st[i].industry));
printf("Vvedite kol-vo pishevoi produkcii ");
scanf("%f", &(st[i].food));
fprintf(data, "%s %lf %lf %lf\n", st[i].name, st[i].medic, st[i].industry, st[i].food);
}
fclose(data);
if (ukaz=='2')
{
data=fopen("data.txt","r");
for(i=0;i<3;i++)
{
fread(&st[i],sizeof(firm),1,data);
printf("%s", st[i].name);
printf("%f", st[i].medic);
printf("%f", st[i].industry);
printf("%f", st[i].food);
}
fclose(data);
}
}
}
0
Gravity
564 / 558 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
05.04.2009, 17:31 #6
Скомпилированный экзешник с моего кода, абсолютно рабочий вариант.
0
Вложения
Тип файла: rar bd.rar (6.1 Кб, 38 просмотров)
CoRoBOK
0 / 0 / 0
Регистрация: 14.03.2009
Сообщений: 23
05.04.2009, 19:06  [ТС] #7
Да работает, но то если я пытаюсь запустить с вашим кодом, то не работает, ошибку выдает, напишите еще раз с тем, где потом в bd.exe компилируете, потому что в том что-то не так

Добавлено через 37 минут 46 секунд
Ой, разобрался) Ошибка в спецификаторе формата была) Теперь нужно научиться сортировку этих данных делать *scratch*

Добавлено через 20 минут 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
#include <stdio.h>
#include <string.h>
#include <conio.h>
int num_firm, total,i,n;
char ukaz;
main()
{
struct firm
{ char name[100];
  int medic;
  int industry;
  int food;
};
clrscr();
firm st[100];
FILE *data;
data=fopen("data.txt","w");
printf(" Nagmite 1 dlya zapolnenia dannuh \n");
printf(" Nagmite 2 dlya zagryzki dannuh \n");
scanf("%c",&ukaz);
if(ukaz=='1')
{
data=fopen("data.txt","w");
    for (i=0;i<3;i++)
{
printf("Vvedite nazvanie firm ");
scanf("%s", &(st[i].name));
printf("Vvedite kol-vo medicinskoi produkcii ");
scanf("%i", &(st[i].medic));
printf("Vvedite kol-vo promushlennoi produkcii ");
scanf("%i", &(st[i].industry));
printf("Vvedite kol-vo pishevoi produkcii ");
scanf("%i", &(st[i].food));
fprintf(data, "%s %i %i %i\n", st[i].name, st[i].medic, st[i].industry, st[i].food);
}
fclose(data);
if (ukaz=='2')
{
data=fopen("data.txt","r");
for(i=0;i<3;i++)
{
fread(&st[i],sizeof(firm),1,data);
printf("%s", st[i].name);
printf("%i", st[i].medic);
printf("%i", st[i].industry);
printf("%i", st[i].food);
}
fclose(data);
}
}
}
0
Gravity
564 / 558 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
06.04.2009, 12:08 #8
Цитата Сообщение от CoRoBOK Посмотреть сообщение
Почему-то нельзя произвести чтение из файла:
Читаешь неправильно. fread хорошо подходит для чтения каких-нибудь числовых массивов, но не данных структуры. Проще юзать fgets.
1
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
07.04.2009, 03:15 #9
Код
char ukaz;
    ...
    scanf("%c", ukaz);
в функцию передаются два адреса, адрес строки "%c" и адрес переменной, она попробует прочитать адрес из ukaz и по нему сохранить символ, поэтому надо адрес самой ukaz передать

Добавлено через 1 минуту 34 секунды
не надо два раза файл открывать

Добавлено через 4 минуты 3 секунды
Код
    scanf("%s", & (st[i].name));
Код
    scanf("%s", st[i].name);
Код
    scanf("%i", &(st[i].medic));
Код
    scanf("%i", &st[i].medic);
0
CoRoBOK
0 / 0 / 0
Регистрация: 14.03.2009
Сообщений: 23
07.04.2009, 19:58  [ТС] #10
Спасибо, попробую, это курсовая у нас. Мне еще препод подсказал, кое-что подправить, сегодня попробую, эти методы тоже. Нужно теперь сортировку делать в алфавитном порядке и сортировку по количеству общей продукции %_%

Добавлено через 2 часа 54 минуты 12 секунд
Что-то не могу сортировку сделать faq прочитал, толком не понял. Нужно упорядочить в алфавитом порядке фирмы

Код
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
struct firm {
    char name[100];
    int medic;
    int industry;
    int food;
    int inform;
    int chemic;
} st[100];

main()
{
    int num_firm, total, i, n;
    char ukaz, *f;
    FILE *data;
    clrscr();
    printf(" Nagmite 1 dlya zapolnenia dannuh -  \n");
    printf(" Nagmite 2 dlya chtenia dannuh - \n");
    printf(" Nagmite 3 dlya sortirovki firm v alfavintom poryadke - \n");
    scanf("%c", &ukaz);
	if(ukaz=='1') {
	data = fopen("data.txt","a");
	for (i=0; i<6; i++) {
	    printf("Vvedite nazvanie firm ");
	    scanf("%s", st[i].name);
	    printf("Vvedite kol-vo medicinskoi produkcii - ");
	    scanf("%i", &st[i].medic);
	    printf("Vvedite kol-vo promushlennoi produkcii - ");
	    scanf("%i", &st[i].industry);
	    printf("Vvedite kol-vo pishevoi produkcii - ");
	    scanf("%i", &st[i].food);
	    printf("Vvedite kol-vo pishevoi produkcii - ");
	    scanf("%i", &st[i].inform);
	    printf("Vvedite kol-vo pishevoi produkcii - ");
	    scanf("%i", &st[i].chemic);
	    fprintf(data, "%s %i %i %i\n", st[i].name, st[i].medic, st[i].industry, st[i].food, st[i].inform, st[i].chemic);
	}
	fclose(data);
    }
    if (ukaz=='2')
     {
	data = fopen("data.txt", "r");
	for(i=0; i<6; i++) {
	    fscanf(data, "%s %i %i %i", &st[i].name, &st[i].medic, &st[i].industry, &st[i].food, &st[i].inform, st[i].chemic);
	    printf("%s %i %i %i\n", st[i].name, st[i].medic, st[i].industry, st[i].food, st[i].inform, st[i].chemic);
	}
	fclose(data);
    }
    if (ukaz=='3')
      {
      for (i=0; i<6;i++)
      {
       for (int j=1; j<6;j++)
	 if(st[i].name < st[j].name)
	 printf("%s", st[i].name);
	 }
       }
    getch();
    return 0;
}
0
Gravity
564 / 558 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
07.04.2009, 21:50 #11
Код
if(st[i].name < st[j].name)
   printf("%s", st[i].name);
Сравнение строк делается так:
Код
if(strcmp(st[i].name, st[j].name) < 0)
Меньше нуля, если st[i].name лексикографически меньше, чем st[j].name.
0
CoRoBOK
0 / 0 / 0
Регистрация: 14.03.2009
Сообщений: 23
08.04.2009, 18:12  [ТС] #12
ну что им не нравиться?
Код
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
struct firm {
    char name[100];
    int medic;
    int industry;
    int food;
    int inform;
    int chemic;
} st[100];

main()
{
    int num_firm, total, i, n;
    char ukaz, *f;
    FILE *data;
    clrscr();
    printf(" Nagmite 1 dlya zapolnenia dannuh -  \n");
    printf(" Nagmite 2 dlya chtenia dannuh - \n");
    printf(" Nagmite 3 dlya sortirovki firm v alfavintom poryadke - \n");
    scanf("%c", &ukaz);
	if(ukaz=='1') {
	data = fopen("data.txt","a");
	for (i=0; i<6; i++) {
	    printf("Vvedite nazvanie firm ");
	    scanf("%s", st[i].name);
	    printf("Vvedite kol-vo medicinskoi produkcii - ");
	    scanf("%i", &st[i].medic);
	    printf("Vvedite kol-vo promushlennoi produkcii - ");
	    scanf("%i", &st[i].industry);
	    printf("Vvedite kol-vo pishevoi produkcii - ");
	    scanf("%i", &st[i].food);
	    printf("Vvedite kol-vo pishevoi produkcii - ");
	    scanf("%i", &st[i].inform);
	    printf("Vvedite kol-vo pishevoi produkcii - ");
	    scanf("%i", &st[i].chemic);
	    fprintf(data, "%s %i %i %i\n", st[i].name, st[i].medic, st[i].industry, st[i].food, st[i].inform, st[i].chemic);
	}
	fclose(data);
    }
    if (ukaz=='2')
     {
	data = fopen("data.txt", "r");
	for(i=0; i<6; i++) {
	    fscanf(data, "%s %i %i %i", &st[i].name, &st[i].medic, &st[i].industry, &st[i].food, &st[i].inform, st[i].chemic);
	    printf("%s %i %i %i\n", st[i].name, st[i].medic, st[i].industry, st[i].food, st[i].inform, st[i].chemic);
	}
	fclose(data);
    }
   [B] if (ukaz=='3')
    {
    f=st[0].name;
    for(int j=6;j>0; j--)
    for(i=1;i<6; i++)
	if(strcmp(st[i].name, st[j].name) <0) f=st[i].name;
	printf("%s",f);[/B]
    }
    getch();
    return 0;
}
0
Gravity
564 / 558 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
08.04.2009, 21:10 #13
Для начала наверно нужно чем-то заполнить массив структур, а то у тебя при нажатии '3' получается, что он еще пуст.
Сама сортировка:
C
1
2
3
4
5
6
7
8
struct firm tmp;
for(int j = 0; j < 6; j++)
   for(i = 0; i < 6; i++)
      if(strcmp(st[i].name, st[j].name) > 0) {
         tmp = st[i];
         st[i] = st[j];
         st[j] = tmp;
      }
Тогда фирмы в st будут упорядочены по алфавиту.
1
CoRoBOK
0 / 0 / 0
Регистрация: 14.03.2009
Сообщений: 23
08.04.2009, 22:07  [ТС] #14
Сделал, как вы прделагаете, но не вышло почему то( Разве он не должен брать те данные что я вбивал раньше и их сортировать?

вот так выглядит та часть, где сортировка:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (ukaz=='4')
{
struct firm tmp;
for(int j = 0; j < 6; j++)
   for(i = 0; i < 6; i++)
      if(strcmp(st[i].name, st[j].name) > 0) {
         tmp = st[i];
         st[i] = st[j];
         st[j] = tmp;
      }
}
getch();
return 0;
}
0
Gravity
564 / 558 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
08.04.2009, 22:41 #15
Цитата Сообщение от CoRoBOK Посмотреть сообщение
Сделал, как вы прделагаете, но не вышло почему то( Разве он не должен брать те данные что я вбивал раньше и их сортировать?
Прога делает ровно то, что ты ей задал. Перед тем, как сортировать, нужно либо читать данные из файла, либо опять заполнять массив вручную.
Вообще, лучше разделить код на несколько функций, например: ввод данных, запись в файл, чтение из файла и сортировка, иначе у тебя в main будет нагромождение кода, в котором трудно разобраться. Да и пользоваться функциями удобнее.
0
08.04.2009, 22:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2009, 22:41
Привет! Вот еще темы с ответами:

Запись и чтение из файла - C++
как записать в файл вывод массива OutputArray(), количество нулевых элементов NumNull(), массив с заменой нулевых элементов на единицу...

Запись и чтение из файла - C++
Всем добрый вечер, как можно записать данные в файл? Например записать в txt файл список паролей. На одном сайте нашел информацию по...

Чтение и запись файла - C++
Странная ситуация читаю файл в вектор. Провожу над ним эксперимент, возвращаю точную копию считанного файла в новый файл с другим...

Запись и чтение из файла - C++
Доброго время суток! Так от балди решыл набросать прогу которая создаёт файл записывает туда 11 рандомных чисел,потом з помощю ifstream я...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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