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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2013, 22:59   #1
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию реализовать сохранение/загрузку массива структур в файл

курсовая по теме бд "Телефонный справочник"
основная проблема с сохранением и загрузкой массива структур, нашел 2 функции в интернете (был почти аналогичный пример), но все равно ошибок куча

Код:
#include <stdio.h>
#include <conio.h>
#include <locale>
#include "Functions.h"
 
#define _CRT_SECURE_NO_WARNINGS
#define COUNT 100
 
struct PhoneBook
{
    int N;
    char Family;
    char Name;
    char Patronymic;
    struct Phone
    {
        int Home;
        int Work;
        int Mobile;
    };
    struct Address
    {
        char Country;
        char City;
        char Street;
        int N_Home;
        int N_Apartment;
    };
    char Email;
} PB[COUNT];
 
const char header[] =
"|---------------------------------------------------------------------------------------------------------------|\n"
"|     |              |              |                    |     Phone     |     Address          |               |\n"
"|  №  |    Family    |     Name     |     Patronymic     |---------------|----------------------|     Email     |\n"
"|     |              |              |                    |     Home      |     Country          |               |\n"
"|     |              |              |                    |     Work      |     City             |               |\n"
"|     |              |              |                    |     Mobile    |     Street           |               |\n"
"|     |              |              |                    |               |     № Home           |               |\n"
"|     |              |              |                    |               |     № Apartament     |               |\n"
"|---------------------------------------------------------------------------------------------------------------|\n";

void Save()
{
FILE  *fp;
register int i;

if((fp=fopen("PhoneBook.txt", "wb"))==NULL) 
{
	printf("Ошибка при открытии файла.\n");
    return;
}

for(i=0; i<COUNT; i++)
	//if(*PB[i].Name)
		if(fwrite(&PB[i], sizeof(struct PhoneBook), 1, fp)!=1)
			printf("Ошибка при записи файла.\n");

  fclose(fp);
}

void Load()
{
FILE  *fp;
register int i;

if((fp=fopen("PhoneBook.txt", "rb"))==NULL) 
{
	printf("Ошибка при открытии файла.\n");
	return;
}

//init_list();
for(i=0; i<COUNT; i++)
	if(fread(&PB[i], sizeof(struct PhoneBook), 1, fp)!=1) 
	{
		if(feof(fp)) break;
		printf("Ошибка при чтении файла.\n");
	}

fclose(fp);
}
 
void main()
{
    setlocale(LC_ALL, "RUSSIAN");
    getch();
}
NewLamer&Programer вне форума Ответить с цитированием
Старый 29.04.2013, 08:42   #2
Hemul
Форумчанин
 
Регистрация: 03.10.2010
Сообщений: 321
По умолчанию

Во-первых, у тебя везде, где должны быть строки, установлен просто тип char.
Во-вторых, лучше записывать и считывать структуру по отдельным полям.


Код:
fwrite(PB[i].N, sizeof(sizeof(int)), 1, fp);
fwrite(PB[i].Family, sizeof(sizeof(char) *STRING_SIZE), 1, fp);
fwrite(PB[i].Name, sizeof(sizeof(int)) *STRING_SIZE, 1, fp);
...
Hemul вне форума Ответить с цитированием
Старый 29.04.2013, 14:50   #3
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

попытался немного модифицировать, 239 ошибок я в шоке

Код:
#define COUNT 100
#define char FileName[100] "PhoneBook.txt"

struct PhoneBook
{
	char N[100];
	char Family[100];
	char Name[100];
	char Patronymic[100];
	struct Phone
	{
		char Home[100];
		char Work[100];
		char Mobile[100];
	};
	struct Address
	{
		char Country[100];
		char City[100];
		char Street[100];
		char N_Home[100];
		char N_Apartment[100];
	};
	char Email[100];
} PB[COUNT];

void Save()
{
	FILE *fp;
	int i;

	fp = fopen(FileName,"w");
	for (i = 0; i < COUNT; i++)
	{
		fwrite(PB[i].N, sizeof(char), 1, fp);
		fwrite(PB[i].Family, sizeof(char), 1, fp);
		fwrite(PB[i].Name, sizeof(char), 1, fp);
		fwrite(PB[i].Patronymic, sizeof(char), 1, fp);
		fwrite(PB[i].Phone.Home, sizeof(char), 1, fp);
		fwrite(PB[i].Phone.Work, sizeof(char), 1, fp);
		fwrite(PB[i].Phone.Mobile, sizeof(char), 1, fp);
		fwrite(PB[i].Address.Country, sizeof(char), 1, fp);
		fwrite(PB[i].Address.City, sizeof(char), 1, fp);
		fwrite(PB[i].Address.Street, sizeof(char), 1, fp);
		fwrite(PB[i].Address.N_Home, sizeof(char), 1, fp);
		fwrite(PB[i].Address.N_Apartment, sizeof(char), 1, fp);
		fwrite(PB[i].Email, sizeof(char), 1, fp);
	}
	fclose(fp);

}

void Load()
{
	FILE *fp;
	int i;

	fp = fopen(FileName,"r");
	for (i = 0; i < COUNT; i++)
	{
		fread(PB[i].N, sizeof(char), 1, fp);
		fread(PB[i].Family, sizeof(char), 1, fp);
		fread(PB[i].Name, sizeof(char), 1, fp);
		fread(PB[i].Patronymic, sizeof(char), 1, fp);
		fread(PB[i].Phone.Home, sizeof(char), 1, fp);
		fread(PB[i].Phone.Work, sizeof(char), 1, fp);
		fread(PB[i].Phone.Mobile, sizeof(char), 1, fp);
		fread(PB[i].Address.Country, sizeof(char), 1, fp);
		fread(PB[i].Address.City, sizeof(char), 1, fp);
		fread(PB[i].Address.Street, sizeof(char), 1, fp);
		fread(PB[i].Address.N_Home, sizeof(char), 1, fp);
		fread(PB[i].Address.N_Apartment, sizeof(char), 1, fp);
		fread(PB[i].Email, sizeof(char), 1, fp);
	}
	fclose(fp);

}
NewLamer&Programer вне форума Ответить с цитированием
Старый 29.04.2013, 15:09   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
239 ошибок я в шоке
Что-то маловато:
Код:
#define char FileName[100] "PhoneBook.txt"
Вы ещё #define true false добавьте...
Abstraction вне форума Ответить с цитированием
Старый 29.04.2013, 15:17   #5
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Что-то маловато:
Код:
#define char FileName[100] "PhoneBook.txt"
Вы ещё #define true false добавьте...
пожалуйста говорите конкретнее, да я плохо понимаю С, я и говорю ошибок куча...
NewLamer&Programer вне форума Ответить с цитированием
Старый 29.04.2013, 15:45   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
пожалуйста говорите конкретнее, да я плохо понимаю С, я и говорю ошибок куча...
Ошибка одна (ну... на самом деле, есть ещё), но не определяемая корректно компилятором.
Какую мысль Вы вкладывали в эту строку?
Код:
#define char FileName[100] "PhoneBook.txt"
Константная строка в C обычно пишется так:
Код:
const char* FileName = "PhoneBook.txt";
А Ваш код заставил компилятор везде заменить (char) на (FileName[100] "PhoneBook.txt"). После чего компилятор попробовал скомпилировать нечто в духе:
Код:
struct PhoneBook
{
	FileName[100] "PhoneBook.txt" N[100];
	FileName[100] "PhoneBook.txt" Family[100];
	FileName[100] "PhoneBook.txt" Name[100];
        //И так далее...
Полагаю, теперь результирующее число ошибок не вызывает у Вас удивления.
Abstraction вне форума Ответить с цитированием
Старый 29.04.2013, 15:53   #7
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

спасибо, ошибок стало меньше, вот что осталось (не хватило символов чтобы тут выложить)
Вложения
Тип файла: txt Ошибки.txt (12.9 Кб, 131 просмотров)
NewLamer&Programer вне форума Ответить с цитированием
Старый 29.04.2013, 16:00   #8
Hemul
Форумчанин
 
Регистрация: 03.10.2010
Сообщений: 321
По умолчанию

Код:
#include <stdio.h>
#define COUNT  100
#define FileName  "file.txt"

struct PhoneBook
{
	char N[100];
	char Family[100];
	char Name[100];
	char Patronymic[100];
	struct Phone
	{
		char Home[100];
		char Work[100];
		char Mobile[100];
	}Phone;
	struct Address
	{
		char Country[100];
		char City[100];
		char Street[100];
		char N_Home[100];
		char N_Apartment[100];
	}Address;
	char Email[100];
} PB[COUNT] ;



void Save(){
	FILE *fp;
	int i;

	fp = fopen( FileName ,"w");
	for (i = 0; i < COUNT ; i++)
	{
		fwrite((PB[i]).N, sizeof(char), 1, fp);
		fwrite(PB[i].Family, sizeof(char), 1, fp);
		fwrite(PB[i].Name, sizeof(char), 1, fp);
		fwrite(PB[i].Patronymic, sizeof(char), 1, fp);
		fwrite(PB[i].Phone.Home, sizeof(char), 1, fp);
		fwrite(PB[i].Phone.Work, sizeof(char), 1, fp);
		fwrite(PB[i].Phone.Mobile, sizeof(char), 1, fp);
		fwrite(PB[i].Address.Country, sizeof(char), 1, fp);
		fwrite(PB[i].Address.City, sizeof(char), 1, fp);
		fwrite(PB[i].Address.Street, sizeof(char), 1, fp);
		fwrite(PB[i].Address.N_Home, sizeof(char), 1, fp);
		fwrite(PB[i].Address.N_Apartment, sizeof(char), 1, fp);
		fwrite(PB[i].Email, sizeof(char), 1, fp);
	}
	fclose(fp);

}

void Load()
{
	FILE *fp;
	int i;

	fp = fopen(FileName,"r");
	for (i = 0; i < COUNT ; i++)
	{
		fread(PB[i].N, sizeof(char), 1, fp);
		fread(PB[i].Family, sizeof(char), 1, fp);
		fread(PB[i].Name, sizeof(char), 1, fp);
		fread(PB[i].Patronymic, sizeof(char), 1, fp);
		fread(PB[i].Phone.Home, sizeof(char), 1, fp);
		fread(PB[i].Phone.Work, sizeof(char), 1, fp);
		fread(PB[i].Phone.Mobile, sizeof(char), 1, fp);
		fread(PB[i].Address.Country, sizeof(char), 1, fp);
		fread(PB[i].Address.City, sizeof(char), 1, fp);
		fread(PB[i].Address.Street, sizeof(char), 1, fp);
		fread(PB[i].Address.N_Home, sizeof(char), 1, fp);
		fread(PB[i].Address.N_Apartment, sizeof(char), 1, fp);
		fread(PB[i].Email, sizeof(char), 1, fp);
	}
	fclose(fp);

}

int main()
{



    return 0;
}

Последний раз редактировалось Hemul; 29.04.2013 в 18:01.
Hemul вне форума Ответить с цитированием
Старый 29.04.2013, 16:07   #9
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
1>d:\институт\программирование\курс овая работа за 1 курс 2 семестр\kr_2s\kr_2s\save-load.cpp(60) : warning C4832: лексема '.' недопустима после UDT 'PhoneBook::Phone'
1> d:\институт\программирование\курсов ая работа за 1 курс 2 семестр\kr_2s\kr_2s\main.cpp(18): см. объявление 'PhoneBook::Phone'
Дело в том, что вот это:
Код:
	struct Phone
	{
		char Home[100];
		char Work[100];
		char Mobile[100];
	};
объявляет тип PhoneBook::Phone ("вложенный" тип) и... всё. Phone, соответственно, имя типа, а не имя какой-либо переменной. Сравните с:
Код:
	struct PhoneType //Имя типа - PhoneType
	{
		char Home[100];
		char Work[100];
		char Mobile[100];
	} Phone; //Сразу создаём переменную этого типа, по имени Phone
Во втором варианте обращение к PB[i].Phone.Home становится осмысленным: "взять глобальную переменную-массив PB, в нём i-ый элемент, у него - переменную-член Phone типа PhoneType, у неё - переменную-член Home".

Предупреждения об устаревших функциях рекомендуется учитывать, по-хорошему... но в основном они касаются ситуации, когда передаваемые аргументы приходят в код "извне" и текстовые строки могут оказаться "неправильными" (не иметь нуль-терминатора на конце, в первую очередь).
Abstraction вне форума Ответить с цитированием
Старый 29.04.2013, 16:11   #10
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

Hemul, несколько вопросов:

Код:
typedef PhoneBook; //что это??? и зачем

typedef struct PhoneBook //опять таки что и зачем (вообще не знаю что такое typedef)
{
	char N[100];
	char Family[100];
	char Name[100];
	char Patronymic[100];
	struct Phone
	{
		char Home[100];
		char Work[100];
		char Mobile[100];
	}Phone; //ну здесь вроде понял, наверное так и правда правильнее, да кстати, может другим именем назвать? а то перекликаться не будут ли?
	struct Address
	{
		char Country[100];
		char City[100];
		char Street[100];
		char N_Home[100];
		char N_Apartment[100];
	}Address; //аналогично
	char Email[100];
}  ;

struct PhoneBook PB[100]; // не совсем понятно чем вам не угодило объявление после структуры как было, ничего если я поставлю struct PhoneBook PB[COUNT]; хотя бы?
1>d:\институт\программирование\курс овая работа за 1 курс 2 семестр\kr_2s\kr_2s\main.cpp(34) : error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>d:\институт\программирование\курс овая работа за 1 курс 2 семестр\kr_2s\kr_2s\main.cpp(37) : error C2371: PhoneBook: переопределение; различные базовые типы
1> d:\институт\программирование\курсов ая работа за 1 курс 2 семестр\kr_2s\kr_2s\main.cpp(34): см. объявление 'PhoneBook'
1>d:\институт\программирование\курс овая работа за 1 курс 2 семестр\kr_2s\kr_2s\main.cpp(57) : warning C4091: typedef : пропускается слева от 'PhoneBook', когда ни одна переменная не объявлена
1>Add, Delete, Change.cpp
1>d:\институт\программирование\курс овая работа за 1 курс 2 семестр\kr_2s\kr_2s\main.cpp(34) : error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>d:\институт\программирование\курс овая работа за 1 курс 2 семестр\kr_2s\kr_2s\main.cpp(37) : error C2371: PhoneBook: переопределение; различные базовые типы
1> d:\институт\программирование\курсов ая работа за 1 курс 2 семестр\kr_2s\kr_2s\main.cpp(34): см. объявление 'PhoneBook'
1>d:\институт\программирование\курс овая работа за 1 курс 2 семестр\kr_2s\kr_2s\main.cpp(57) : warning C4091: typedef : пропускается слева от 'PhoneBook', когда ни одна переменная не объявлена
1>Save-Load.cpp
1>d:\институт\программирование\курс овая работа за 1 курс 2 семестр\kr_2s\kr_2s\main.cpp(34) : error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>d:\институт\программирование\курс овая работа за 1 курс 2 семестр\kr_2s\kr_2s\main.cpp(37) : error C2371: PhoneBook: переопределение; различные базовые типы
1> d:\институт\программирование\курсов ая работа за 1 курс 2 семестр\kr_2s\kr_2s\main.cpp(34): см. объявление 'PhoneBook'
1>d:\институт\программирование\курс овая работа за 1 курс 2 семестр\kr_2s\kr_2s\main.cpp(57) : warning C4091: typedef : пропускается слева от 'PhoneBook', когда ни одна переменная не объявлена

Последний раз редактировалось NewLamer&Programer; 29.04.2013 в 16:16.
NewLamer&Programer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранение многомерного массива в файл Agrahil Общие вопросы Delphi 7 10.12.2011 13:55
сохранение массива float в файл alvahtin Общие вопросы C/C++ 1 11.10.2011 12:55
Сохранение массива в файл Дмитрий Стариков Общие вопросы Delphi 7 26.09.2010 19:51
Сохранение двумерного массива в файл AngelOfDeath Общие вопросы Delphi 5 04.10.2008 09:37
Сохранение массива в файл Artem Общие вопросы Delphi 10 11.12.2007 20:00