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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2009, 21:05   #21
Alik-Soldier
Пользователь
 
Регистрация: 01.05.2009
Сообщений: 38
По умолчанию

Эм...тяжелый случай...)
Alik-Soldier вне форума Ответить с цитированием
Старый 27.05.2009, 21:12   #22
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Alik-Soldier
Эм...тяжелый случай...)
Действительно.

Просмотрите свой код и подумайте, что у вас есть (в каком виде данные находятся в файле) и что делает каждая функция в коде.

Если, к примеру, у вас в файле 3 строки, то чтобы из прочитать нужно ТРИ РАЗА вызвать функцию для чтения строки.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 27.05.2009, 21:16   #23
Alik-Soldier
Пользователь
 
Регистрация: 01.05.2009
Сообщений: 38
По умолчанию

Это я понимаю...причем уже 2 часа понимаю тупо уставившись в код...а реализовать не могу...
Alik-Soldier вне форума Ответить с цитированием
Старый 27.05.2009, 21:24   #24
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Запись об одном человеке в файле занимает 5 строк.
Первая - ФИО. Читаете эту строку. Делите ее через strtok.
Вторая строка - адрес. Читаете ее и делите.
Третья - год. Читаете ее, переводите в число.
Четвертая - номер. Читаете и переводите.
Пятую просто читаете. Чтобы пропустить.

В stdio для чтения строки есть функция fgets.

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

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 27.05.2009 в 21:26.
Sazary вне форума Ответить с цитированием
Старый 27.05.2009, 21:25   #25
Alik-Soldier
Пользователь
 
Регистрация: 01.05.2009
Сообщений: 38
По умолчанию

Спасибо)сейчас попробую)
Alik-Soldier вне форума Ответить с цитированием
Старый 27.05.2009, 21:35   #26
Alik-Soldier
Пользователь
 
Регистрация: 01.05.2009
Сообщений: 38
По умолчанию

а что за fstream?я искал в инете,есть описание только на английском...
Alik-Soldier вне форума Ответить с цитированием
Старый 27.05.2009, 21:42   #27
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Это класс из библиотеки IOstream. Для работы с файлами.
Посмотрите тут:
http://www.cplusplus.com/reference/iostream/fstream/
На английском, но все должно быть понятно.

Если умеете работать с iostream, то быстро разберетесь.

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

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 27.05.2009, 21:47   #28
Alik-Soldier
Пользователь
 
Регистрация: 01.05.2009
Сообщений: 38
По умолчанию

Хорошо)спасибо большое
Alik-Soldier вне форума Ответить с цитированием
Старый 27.05.2009, 22:27   #29
Alik-Soldier
Пользователь
 
Регистрация: 01.05.2009
Сообщений: 38
По умолчанию

вот я написал код:
Код:
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <string.h>
#include <fstream>
using namespace std;
void Choice();
char buff[5000];
FILE *f=fopen("telephon.txt", "a");		//Открыть файл для дозаписи
    struct TelAbon					//Структура для абонента
    {
		struct FIO
		{
        char surname[50];		//Фамилия 
        char name[50];			//Имя
        char second_name[50];	//Отчество
		};
	FIO fio;
	char adress[100];		//Адрес абонента
    int year;					//Год установки телефона
    int number;					//Номер телефона
    };
class Telephon					//Создаю свой класс
{
public:
    Telephon();			//Конструктор	
    //~Telephon();		//Деструктор
	int LoadFile();	//Функция для считывания информации из файла
    void Dobavit();	//Функция для добавления экземпляра структуры
    void Ydalit();		//Функция для удаления экземпляра структуры
    void Naity();		//Функция для поиска по адресу/фамилии	
    void Analiz();		//Функция печатает количество телефонов,установленных в определенном году
	TelAbon mas[500];
};
Telephon tel;					//Экземпляр класса
Telephon::Telephon()			//Инициализация конструктора
{
}
/*Telephon::~Telephon()			//Инициализация деструктора
{
    return 0;
}*/
int Telephon::LoadFile()
{
	FILE *f=fopen("telephon.txt", "r");
	if((f=fopen("telephon.txt","r"))==NULL)
        printf("Cannot open file\n");
	char buff[500];
	char *ptr;
	ptr = (char*)&buff;
	int i=0;
	while(!feof(f))
	{	
		ptr = fgets (ptr, sizeof(buff), f);
		strtok (ptr," ");
		strcpy (mas[i].fio.surname, buff);
		strtok (buff, " ");
		strcpy (mas[i].fio.name, buff);
		strtok (buff, "\n");
		strcpy(mas[i].fio.second_name,buff);
		ptr = fgets (ptr, 100, f);
		strtok (buff, "\n");
		strcpy (mas[i].adress, buff);
		ptr = fgets(ptr, sizeof(buff), f);
		fread (&mas[i].year, sizeof(int), 1, f);
		fread (&mas[i].number, sizeof(int), 1, f);
		i++;
	}
	for(int j=0;j<=i;j++)
	{
		printf("%s %s %s\n",mas[j].fio.surname,mas[j].fio.name,mas[j].fio.second_name);
		printf("%s\n",mas[j].adress);
		printf("%d\n",mas[j].year);
		printf("%d\n",mas[j].number);
	}
	return i;
}

void Telephon::Dobavit()		
{
	int c=LoadFile();
	char control[1];
    fprintf(f,"\n");
	for(int i=c;i<(c+10);i++)
	{
	cout<<"Enter telephone subscriber surname, name and second name"<<endl; //ФИО абонента
	cin.getline(mas[i].fio.surname,sizeof(mas[i].fio.surname),32);				
    cin.getline(mas[i].fio.name,sizeof(mas[i].fio.name),32);
    cin.getline(mas[i].fio.second_name,sizeof(mas[i].fio.second_name));
	cout<<"Enter telephone subscriber adress:"<<endl;				//Адрес абонента
    cin.getline(mas[i].adress,sizeof(mas[i].adress));
	cout<<"Enter year of telephon installation"<<endl;		//Год установки телефона
    cin>>mas[i].year;
	cout<<"Enter telephone number:"<<endl;			//Номер телефона
    cin>>mas[i].number;
    fprintf(f,"%s %s %s\n",mas[i].fio.surname,mas[i].fio.name,mas[i].fio.second_name); //...
    fprintf(f,"%s\n",mas[i].adress);   //...
    fprintf(f,"%d\n",mas[i].year);						//...
    fprintf(f,"%d\n",mas[i].number);	/запись в файл экзмепляра структуры
	cout<<"Do You want to add still telephone subscriber (Y or N)?"<<endl;
	cin>>control;
	if(c==78)break;
	}
}
void Telephon::Ydalit()
{
}
void Telephon::Naity()
{
}
void Telephon::Analiz()
{ 
}
int main()
{
	tel.LoadFile();
    fclose(f); 
    return 0;
}

void Choice()
{
	int control;					//Переменная для реакции на клавиатуру
	cout<<"Choose menu position"<<endl;		//Выбрать позицию из меню
    cout<<"\nMENU:\n1.Add telephone subscriber \n2.Find telephone subscriber \n3.Remove telephone subscriber \n4. Analysis \n5. Exit\n"<<endl;
    cin>>control;
    for(;;)
    {
        if(control==1)
            tel.Dobavit();
		else
        if(control==5)break;
		else
			cout<<"You press incorrect button. Please repeat"<<endl;	//Нажата неверная клавиша, повторить
		cout<<"Choose menu position"<<endl;
        cin>>control;
	}
}
файл тот же самый что и выше. Выводит эти три структуры...Но затем выводит через строки 2 лишних два нуля в столбик,например вот так:
"Фамилия имя отчество
Адрес
Год Телефон

0
0"
Почему так может быть?
Да....И год с номером выводит коряво,не так как в файле...

Последний раз редактировалось Sazary; 27.05.2009 в 23:25.
Alik-Soldier вне форума Ответить с цитированием
Старый 27.05.2009, 23:33   #30
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Вот так цикл измените:
Код:
while(!feof(f))
	{
		fgets (buff, sizeof(buff), f);
		strtok (buff," ");
		strcpy (mas[i].fio.surname, buff);
		strtok (NULL, " ");
		strcpy (mas[i].fio.name, buff);
		strtok (NULL, "\n");
		strcpy(mas[i].fio.second_name,buff);
		fgets (buff, 100, f);
		strcpy (mas[i].adress, buff);
		fgets(buff, sizeof(buff), f);
		mas[i].year = atoi(buff);
		fgets(buff,sizeof(buff),f);
		mas[i].number = atoi(buff);
		fgets(buff,sizeof(buff),f);
		i++;
	}
А в следующем цикле (вывод) по j нужно идти до i не включая.
То есть:
Код:
for(int j=0;j<i;j++)
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Классы в С++ S2S Общие вопросы C/C++ 0 15.03.2009 13:25
Классы bondik Общие вопросы C/C++ 1 14.12.2008 14:19
Классы MaxiMILLION Помощь студентам 4 12.10.2008 14:05
классы ShenDy Общие вопросы C/C++ 1 12.04.2008 14:01