Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2017, 13:03   #1
KariLex
Пользователь
 
Регистрация: 01.04.2017
Сообщений: 27
По умолчанию Информация о студенте из файла, вывод другой информации в файл

Помогите пожалуйста найти ошибку, что уже только не перепробовала, не могу найти
После ввода группы пишет, что поврежден стек вокруг переменной "inst"
Тип группы должен быть char

Вот задание. Определить переменную "студент", содержащую следующие поля: имя, фамилия, отчество студента, название института, номер группы. Данные считать из текстового файла. Вывести данные о студентах, которые учатся в одном и том же институте, и в одной группе.
Код:
#include "stdafx.h"
#include <locale.h>
#include <string.h>
#define size 100
typedef struct
{
    char famly[20];
    char fName[20];
    char sName[20];
    char univer[20];
    char group[20];
} Student;
void find(FILE *fo, Student *stud, char *gr, char *inst, int n)
{
    for (int i = 0; i < n; i++)
    
        if ((stud[i].group == gr) && (strcmp(stud[i].univer, inst) == 0))
        {
            printf("%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
            fprintf(fo, "%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
        }
    
}
int main()
{
    setlocale(LC_ALL, "Russian");   
    int n = 0;
    int i = 0;
    char inst;
    char gr;
    Student stud[size];
    FILE *fp = fopen("C:\\Users\\Ekaterina\\Desktop\\fin.txt", "r");
    
    //while (!feof(fp))
 
    for (i = 0; !feof(fp); i++)
    {
        fscanf(fp, "%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, &stud[i].group);
        printf("%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, &stud[i].group);
        n++;
    }
    printf("Введите институт");
    scanf("%s",&inst);
    printf("Введите группу");
    scanf("%s", &gr);
    FILE *fo = fopen("C:\\Users\\Ekaterina\\Desktop\\fo3.txt", "w+");
    find(fo, stud, &gr, &inst,n);
    return 0;
}
KariLex вне форума Ответить с цитированием
Старый 28.05.2017, 13:06   #2
KariLex
Пользователь
 
Регистрация: 01.04.2017
Сообщений: 27
По умолчанию

входящий файл
Вложения
Тип файла: txt fIn.txt (275 байт, 115 просмотров)
KariLex вне форума Ответить с цитированием
Старый 28.05.2017, 13:43   #3
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Работаете с чаром:

Цитата:
Сообщение от KariLex Посмотреть сообщение
Код:
char inst;
char gr;
А на входе ожидаете строки:

Цитата:
Сообщение от KariLex Посмотреть сообщение
Код:
printf("Введите институт");
scanf("%s",&inst);
printf("Введите группу");
scanf("%s", &gr);
Некорректное сравнение строк (причём вторая половина условия сделана правильно, что странно):

Код:
if ((stud[i].group == gr)
В функциях fscanf и printf в последнем параметре

Код:
&stud[i].group
амперсанд не сильно нужен.

Ну и чисто косметически - приглашения на ввод не отделены пробелом от самого ввода, всё сольётся:

Код:
printf("Введите институт");
scanf("%s",&inst);
printf("Введите группу");
scanf("%s", &gr);
Вот так работает:

Код:
#include <stdio.h>
#include <locale.h>
#include <string.h>
#define size 100
typedef struct
{
	char famly[20];
	char fName[20];
	char sName[20];
	char univer[20];
	char group[20];
} Student;

void find(FILE *fo, Student *stud, char *gr, char *inst, int n)
{
	for (int i = 0; i < n; i++){

		if ((strcmp(stud[i].group, gr) == 0) && (strcmp(stud[i].univer, inst) == 0))
		{
			printf("%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
			fprintf(fo, "%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
		}
		}

}

int main()
{
	setlocale(LC_ALL, "Russian");
	int n = 0;
	int i = 0;
	char inst[20];
	char gr[20];
	Student stud[size];
	FILE *fp = fopen("C:\\fin.txt", "r");

	//while (!feof(fp))

	for (i = 0; !feof(fp); i++)
    {
        fscanf(fp, "%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
		printf("%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
        n++;
    }
	printf("Введите институт: ");
	scanf("%s", &inst);
	printf("Введите группу: ");
	scanf("%s", &gr);
	FILE *fo = fopen("C:\\fo3.txt", "w+");
	find(fo, stud, gr, inst,n);
	return 0;
}
P.S. Пути файлов обратно поменяйте, я под себя переделывал, чтоб отладить
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 28.05.2017 в 13:48.
Sciv вне форума Ответить с цитированием
Старый 28.05.2017, 13:54   #4
KariLex
Пользователь
 
Регистрация: 01.04.2017
Сообщений: 27
По умолчанию

Спасибо большое. А почему не выводит в файл результат?
Т.е я ввожу институт и группу и на экране и в файле должны оказаться данные о людях, из этого инст и гр. А у меня ничего
KariLex вне форума Ответить с цитированием
Старый 28.05.2017, 13:55   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Поменяйте хотя бы у одного человека русское название на латинское (например MGU). И проверьте в программе. Если выведет - значит дело в кириллице.

Я проверял на первом из списка, менял ему на MGU - всё выводилось
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 28.05.2017, 13:58   #6
KariLex
Пользователь
 
Регистрация: 01.04.2017
Сообщений: 27
По умолчанию

Поменяла, все выдало. Спасибо большое за помощь!
KariLex вне форума Ответить с цитированием
Старый 28.05.2017, 14:05   #7
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитирую из одного форума:

Цитата:
Для того, чтобы в консоли выводились русские символы, необходимо:
добавить #include <windows.h>
в самом начале функции main добавить строчки SetConsoleOutputCP(1251) и SetConsoleCP(1251)
и в свойствах консольного окна поставить шрифт Lucida Console ( по желанию увеличив размер шрифта)
ну и в конце перед return Не мешает запаузить, чтобы успеть увидеть, что консоль вывела:

Код:
system("pause");
Итого код примет вид:

Код:
#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <windows.h>

#define size 100
typedef struct
{
	char famly[20];
	char fName[20];
	char sName[20];
	char univer[20];
	char group[20];
} Student;

void find(FILE *fo, Student *stud, char *gr, char *inst, int n)
{
	for (int i = 0; i < n; i++){

		if ((strcmp(stud[i].group, gr) == 0) && (strcmp(stud[i].univer, inst) == 0))
		{
			printf("%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
			fprintf(fo, "%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
		}
		}

}

int main()
{
	SetConsoleOutputCP(1251);
	SetConsoleCP(1251);

	int n = 0;
	int i = 0;
	char inst[20];
	char gr[20];
	Student stud[size];
	FILE *fp = fopen("C:\\fin.txt", "r");

	//while (!feof(fp))

	for (i = 0; !feof(fp); i++)
    {
		fscanf(fp, "%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
		printf("%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
        n++;
    }
	printf("inst");
	scanf("%s", &inst);
	printf("group");
	scanf("%s", &gr);
	FILE *fo = fopen("C:\\fo3.txt", "w+");
	find(fo, stud, gr, inst,n);
	system("pause");
	return 0;
}
Главное - сразу после запуска не забыть установить в свойствах (правой кнопкой по окну консоли - Свойства) шрифт Lucida Console
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 28.05.2017 в 14:08.
Sciv вне форума Ответить с цитированием
Старый 28.05.2017, 15:00   #8
KariLex
Пользователь
 
Регистрация: 01.04.2017
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Главное - сразу после запуска не забыть установить в свойствах (правой кнопкой по окну консоли - Свойства) шрифт Lucida Console
А для чего шрифт? Просто по желанию получается
KariLex вне форума Ответить с цитированием
Старый 28.05.2017, 15:12   #9
KariLex
Пользователь
 
Регистрация: 01.04.2017
Сообщений: 27
По умолчанию

А, все, я почитала методички, все поняла ,спасибо
KariLex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод информации из файла(паскаль) Arabic_Coffee Помощь студентам 2 14.05.2011 18:27
Вывод символьной информации из файла atenon C++ Builder 3 27.03.2011 14:49
Обновление и вывод информации из файла в Delphi Николай ПН Помощь студентам 1 26.04.2010 23:04
вывод информации из файла pautina Общие вопросы Delphi 12 26.01.2009 08:54
Вывод информации в Memo из файла. Фибер Оптик Общие вопросы Delphi 11 04.05.2007 00:13