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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2011, 20:28   #1
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию [C/C++] Структура. Запись/чтение в/из файл(a)

Писал програмку по такому заданию - нужно осуществлять запись структуры в файл и потом поиск по файлу по введённым данным, и в конце вылазит такая ошибка ->тыц
Получается, что что то выходит за выделенную память и из за этого рушиться стэк. Вроде пересмотрел всё что можно и любые варианты, но всё равно ошибку не нашёл.
Помогите пожалуйста.
Вот код:
Код:
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
using namespace std;

struct Student
{
	int kod_studenta;
	char name[30];
	char predmet[30];
	int ocenka;
};

void enter_data(Student *);
void display_data(Student *, int);
void find_data(char *);

int n;
FILE * st_data;

int main ()
{
	
	cout << "Enter student's number: ";
	cin >> n;
	Student* st=new Student[n]; // сколько раз будем вводить данные

	for (int i=0;i<n;i++)
	{
		enter_data(&st[i]); // вводим данные "энное" количество раз
	}
	// display_data(st,n);     // выводим то, что заполняли

	st_data=fopen("C:\\Students.dat", "w"); // создаём файл с названием Students.dat в указанном пути
	if( (st_data=fopen("C:\\Students.dat", "w")) == 0 )
		{
			cout << "Error with creating file !\n" << endl; // выводится текст с ошибкой, если
		}                                                   // создание файла не удалось
	else
		{
			fwrite(st,sizeof(Student),n,st_data); // записываем в файл информацию со структуры Students
			fclose(st_data);   // закрываем поток с файлом

			char ppoisk; // объявляем переменную для поиска студента
			char *poisk = &ppoisk;
			cout << "\nEnter name: ";
			cin >> poisk;
			find_data(poisk); // вызываем функцию для поиска студента в файле
		}
	cout << "\n\nPress any key to exit ...";
	getch();
	return 0;
}
void enter_data(Student *s) // функция для ввода данных в струткуру
{
	cout << "\nEnter student code: ";
	cin >> s->kod_studenta;
	cout << "Enter student name: ";
	cin >> s->name;
	cout << "Enter subject: ";
	cin >> s->predmet;
	cout << "Enter subject score: ";
	cin >> s->ocenka;
}
void display_data(Student *s, int n) // функция для вывода введённого содержимого
{                                    // студентоы и их информация
	for (int i=0;i<n;i++)
	{
		cout << "\n--------------------------------------------";
		cout << "\nStudent code: " << s[i].kod_studenta << "\n" <<
			    "Student name: " << s[i].name << "\n" << 
			    "Subject: " << s[i].predmet << "\n" << 
			    "Student subject score: " << s[i].ocenka << endl;
		cout << "--------------------------------------------\n";
	}
}
void find_data(char *imja) // функция для поиска студента в файле
{                          // и вывода средней оценки
	st_data=fopen("C:\\Students.dat", "r");   // открываем файл для чтения
		if( (st_data=fopen("C:\\Students.dat", "r")) == 0 )
			{
				cout << "Error with reading file !\n" << endl; // выводится текст с ошибкой,
			}                                                  // если чтение файла не удалось
		else
		{
			int fsize;
			fseek(st_data,0,SEEK_END);
			fsize=ftell(st_data);
			n=fsize/sizeof(Student);
			// cout << "\nCount of note's: " << n << endl; // выводит колличество записей в файле
			Student* st2=new Student[n];
			double sred_ball = 0, sred_arif = 0;
			for(int i = 0; i <= n; i++)
			{
				if(strcmp(st2[i].name, imja) == 0)
					{
						st2[i].ocenka += sred_ball;
						sred_arif++;
					}
			}
			double ocenkaStudenta = sred_ball/sred_arif;
			cout << "Student's " << imja << " average mark is " << ocenkaStudenta;
		}
}
З.Ы. А как можно сделать, что бы путь для сохранения/чтения можно было прописывать в ходе работы программы в моём случае ?

Последний раз редактировалось Stilet; 13.05.2011 в 20:18.
hvz- вне форума Ответить с цитированием
Старый 10.05.2011, 23:16   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Попробуй воспользоваться отладчиком, я не в курсе, у меня-то всё сразу получается как надо, но, по слухам, результаты использования просто феноменальные.
Rififi вне форума Ответить с цитированием
Старый 12.05.2011, 20:04   #3
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Помогите пожалуйста, никак не могу найти ошибку
hvz- вне форума Ответить с цитированием
Старый 12.05.2011, 22:07   #4
osichev
Форумчанин
 
Регистрация: 18.05.2009
Сообщений: 180
По умолчанию

Код:
char ppoisk; // объявляем переменную для поиска студента 
            char *poisk = &ppoisk; 
            cout << "\nEnter name: "; 
            cin >> poisk; 
            find_data(poisk); // вызываем функцию для поиска студента в файле
что не пойму.а что ты тут делаешь?зачем 2 переменные объявляешь?
Программист без пива, как спирт без пробки - выдохнется___________-
osichev вне форума Ответить с цитированием
Старый 13.05.2011, 18:51   #5
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Цитата:
Сообщение от osichev Посмотреть сообщение
что не пойму.а что ты тут делаешь?зачем 2 переменные объявляешь?
Если вы имеете ввиду это:
Код:
char ppoisk;
char *poisk = &ppoisk;
То тут я делаю указатель, что бы тут не было ошибок при сравнении:
Код:
if(strcmp(st2[i].name, imja) == 0)
Может я где то и ошибаюсь, т.к. новичёк.
hvz- вне форума Ответить с цитированием
Старый 25.05.2011, 14:19   #6
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

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

PHP код:
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define INST_READ_PATH "H:\\Students.dat" // Путь для сохранения указывать здесь!!!
#define MAS_SIZE 30
using namespace std;

struct Student
{
    
int kod_studenta;
    
char name[MAS_SIZE];
    
char predmet[MAS_SIZE];
    
int ocenka;
};

void enter_data(Student *);
void display_data(Student *, int);
void find_data(char *);

int n;
FILE st_data;

int main ()
{
    
    
cout << "Enter student's number: ";
    
cin >> n;
    
Studentst=new Student[n]; // сколько раз будем вводить данные

    
for (int i=0;i<n;i++)
    {
        
enter_data(&st[i]); // вводим данные "энное" количество раз
    
}
    
/* display_data(st,n);     // выводим то, что заполняли */

    
st_data=fopen(INST_READ_PATH"w"); // создаём файл с названием Students.dat в указанном пути
    
if( (st_data=fopen(INST_READ_PATH"w")) == )
        {
            
cout << "Error with creating file !\n" << endl// выводится текст с ошибкой, если
        
}                                                   // создание файла не удалось
    
else
        {
            
fwrite(st,sizeof(Student),n,st_data); // записываем в файл информацию со структуры Students
            
fclose(st_data);   // закрываем поток с файлом

            
char poisk[MAS_SIZE];
            
//char *ppoisk = &ppoisk;
            
cout << "\nEnter name: ";
            
cin >> poisk;
            
find_data(poisk);
        }
    
cout << "\n\nPress any key to exit ...";
    
getch();
    return 
0;
}
void enter_data(Student *s)
{
    
cout << "\nEnter student code: ";
    
cin >> s->kod_studenta;
    
cout << "Enter student name: ";
    
cin >> s->name;
    
cout << "Enter subject: ";
    
cin >> s->predmet;
    
cout << "Enter subject score: ";
    
cin >> s->ocenka;
}
void display_data(Student *sint n)
{
    for (
int i=0;i<n;i++)
    {
        
cout << "\n--------------------------------------------";
        
cout << "\nStudent code: " << s[i].kod_studenta << "\n" <<
                
"Student name: " << s[i].name << "\n" << 
                
"Subject: " << s[i].predmet << "\n" << 
                
"Student subject score: " << s[i].ocenka << endl;
        
cout << "--------------------------------------------\n";
    }
}
void find_data(char *imja)
{
    
st_data=fopen(INST_READ_PATH"r");   // открываем файл для чтения
        
if( (st_data=fopen(INST_READ_PATH"r")) == )
            {
                
cout << "Error with reading file !\n" << endl// выводится текст с ошибкой,
            
}                                                  // если чтение файла не удалось
        
else
        {
            
int fsize;
            
fseek(st_data,0,SEEK_END);
            
fsize=ftell(st_data);
            
n=fsize/sizeof(Student);
            
// cout << "\nCount of note's: " << n << endl; // выводит колличество записей в файле
            
Studentst2=new Student[n];
            
double sred_ball 0sred_arif 0;
            for(
int i 0<= ni++)
            {
                if(
strcmp(st2[i].nameimja)==0)
                    {
                        
sred_ball += st2[i].ocenka;
                        
sred_arif++;
                    }
            }
            
double ocenkaStudenta 0;
            
ocenkaStudenta sred_ball/sred_arif;
            
cout << "Student's " << imja << " average mark is " << ocenkaStudenta;
        }

Помогите
hvz- вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение\запись в файл VirtualAngel Помощь студентам 2 12.02.2011 12:54
Чтение и запись из/в файл Pirotexnik Общие вопросы C/C++ 7 28.01.2011 16:54
Чтение и запись в файл Dycek Общие вопросы C/C++ 0 18.01.2011 15:04
Чтение и запись в файл. Ky3Heu, Помощь студентам 0 01.01.2010 11:24
Чтение и запись в файл deagle05 Общие вопросы C/C++ 3 22.12.2009 00:11