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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2013, 10:45   #11
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Вот всё равно эта ошибка: Unhandled exception at 0x01101471 in lab3_Artur.exe: 0xC0000005: Access violation reading location 0x00000001.
ну что же такое то творится с этой лабой =(

Вот функции записи и чтения:
Код:
void WriteStudentToFile(Student *st, int stud_number)
{
	DWORD dwBytesWritten;
	char file_path[] = "C:\\Student\\stud.dat";
	if(HANDLE hFile = CreateFileA(file_path, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL))
	{
		for(int i=0; i<stud_number; i++)
		{
			SetFilePointer(hFile, NULL, NULL, FILE_END);
			WriteFile(hFile, st + i, sizeof(Student), &dwBytesWritten, NULL);
		}
		CloseHandle(hFile);
		printf("\nStudents writed to file %s\n", file_path);
	}
	else
	{
		printf("Error while creating file %s for writing!\n", file_path);
		CloseHandle(hFile);
	}
}

void ReadStudentFromFile(void)
{
	char file_path[] = "C:\\Student\\stud.dat";
	if(HANDLE hFile = CreateFileA(file_path, GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL))
	{
		printf("%s contains:\n\n", file_path);
		Student *st_buf;
		DWORD dwBytesRead;
		int i=1;
		ReadFile(hFile, &st_buf, sizeof(Student), &dwBytesRead,NULL);
		while (dwBytesRead)
		{	
			printf("----------%d----------\n", i++);
			printf("Student code: %d\n", st_buf->code);
			printf("Student name: %s\n", st_buf->name);
			printf("Student surname: %s\n", st_buf->surname);
			printf("Student group: %s\n", st_buf->group);
			printf("----------------------\n");
			ReadFile(hFile, &st_buf, sizeof(Student), &dwBytesRead, NULL);
		}
		CloseHandle(hFile);
	}
	else
	{
		printf("Error while creating file %s for reading!\n", file_path);
		CloseHandle(hFile);
	}
}
Функция записи вроде бы нормально работает, т.е. размер файла меняется. Может всё таки неверно записывает?
А может надо каждый атрибут структуры по отдельности читать и потом выводить?
hvz- вне форума Ответить с цитированием
Старый 16.01.2013, 10:50   #12
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Мы по второму кругу пойдем? Говорил ведь уже в первом посте
Student st_buf;
...
printf("Student code: %d\n", st_buf.code);
EUGY вне форума Ответить с цитированием
Старый 16.01.2013, 10:56   #13
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Мы по второму кругу пойдем? Говорил ведь уже в первом посте
Student st_buf;
...
printf("Student code: %d\n", st_buf.code);
Спасибо вам большое за ответы, всё заработало!

Я вот только одного не понимаю, почему компилятор VS2010 воспринимает (как я понимаю) Student *st как класс?
Т.е. st.code - не сработает, напишет что должен быть класс т.е. st->code.
А если Student st (без указателя) то воспринимает как структуру и запись st.code сработает.
hvz- вне форума Ответить с цитированием
Старый 16.01.2013, 11:08   #14
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Я вот только одного не понимаю, почему компилятор VS2010 воспринимает (как я понимаю) Student *st как класс?
Т.е. st.code - не сработает, напишет что должен быть класс т.е. st->code.
А если Student st (без указателя) то воспринимает как структуру и запись st.code сработает.
Компилятор воспринимает Student *st как переменную. Как указатель на класс.
Student *st_buf; // этот указатель никуда не указывает.
А должен бы.
Либо
st_buf = new Student; // новый адрес

Либо
Student xst;
st_buf = &xst; //существующий адрес

функция ReadFile хочет видеть существующий адрес в памяти,
куда будет возможно записать данные длиной sizeof(Student).
EUGY вне форума Ответить с цитированием
Старый 16.01.2013, 11:11   #15
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,372
По умолчанию

. и -> не имеют отношение к класс/структуре. И то и другое может быть и там и там.
waleri вне форума Ответить с цитированием
Старый 16.01.2013, 11:16   #16
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Спасибо вам за ответы, теперь буду в курсе)
hvz- вне форума Ответить с цитированием
Старый 16.01.2013, 11:16   #17
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
. и -> не имеют отношение к класс/структуре. И то и другое может быть и там и там.
А, вопрос был в этом смысле. Я просто не понял.

ЗЫ.
Я тут чуток ошибся:
if(HANDLE hFile = CreateFileA(
Нет проверки на INVALID_HANDLE_VALUE
EUGY вне форума Ответить с цитированием
Старый 16.01.2013, 18:18   #18
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
А, вопрос был в этом смысле. Я просто не понял.

ЗЫ.
Я тут чуток ошибся:
if(HANDLE hFile = CreateFileA(
Нет проверки на INVALID_HANDLE_VALUE
Хехе, и я забыл про это. Но всё равно всё прекрасно работает)
hvz- вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ReadFile/WriteFile - нужен совет. Linnk Win Api 1 07.08.2012 15:57
ошибка в программе - Create ReadFile handle Ted_45 Win Api 2 25.06.2012 20:17
ReadFile() Madmaxisss Visual C++ 4 02.04.2012 01:01
проблема с ReadFile Fog Win Api 4 01.02.2011 12:51
ReadFile nazavrik Общие вопросы C/C++ 14 22.11.2009 15:11