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

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

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

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

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

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

Подскажите еще пжл,вот я пишу код такой для записи из файла в массив структур:
Код:
  struct TelAbon					//Структура для абонента
    {
		struct FIO
		{
        char surname[50];		//Фамилия 
        char name[50];			//Имя
        char second_name[50];	//Отчество
		};
	FIO fio;
	char adress[100];			//Адрес абонента
    int year;					//Год установки телефона
    int number;					//Номер телефона
    };

........

	FILE *f=fopen("telephon.txt", "r");
	if((f=fopen("telephon.txt","r"))==NULL)
        cout<<"Cannot open file"<<endl;
	char buff[500];
	ifstream fileIn;
	int i=0;
	while(!fileIn.eof())
	{	
		char *ptr_1, *ptr_2, *ptr_3, *ptr_4; 
		int *ptr_5, *ptr_6;
		ptr_1 = (char *) &mas[i].fio.surname;
		ptr_2 = (char *) &mas[i].fio.name;
		ptr_3 = (char *) &mas[i].fio.second_name;
		ptr_4 = (char *) &mas[i].adress;
		ptr_5 = (int *) &mas[i].year;
		ptr_6 = (int *) &mas[i].number;
		fileIn.getline(buff,500);
		ptr_1 = strtok (buff," ");
		ptr_2 = strtok (NULL," ");
		ptr_3 = strtok (NULL,"\n");
		ptr_4 = strtok (NULL,"\n");
		ptr_5 = strtok (NULL,"");
		ptr_6 = strtok (NULL,"\n");
		i++;

.........
Но проблема в том,что mas[i].year и mas[i].number переменные типа int. И не могут они использоваться через strtok...Что делать...?
Alik-Soldier вне форума Ответить с цитированием
Старый 27.05.2009, 19:22   #12
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Но проблема в том,что mas[i].year и mas[i].number переменные типа int. И не могут они использоваться через strtok...Что делать...?
Преобразуйте в число с помощью atoi
Что-то вроде:
Код:
ptr_5 = atoi(strtok(NULL,"\n"));
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

Код:
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <stdio.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)
        cout<<"Cannot open file"<<endl;
	char buff[500];
	ifstream fileIn;
	int i=0;
	while(!fileIn.eof())
	{	
		char *ptr_1, *ptr_2, *ptr_3, *ptr_4; 
		ptr_1 = (char *) &mas[i].fio.surname;
		ptr_2 = (char *) &mas[i].fio.name;
		ptr_3 = (char *) &mas[i].fio.second_name;
		ptr_4 = (char *) &mas[i].adress;
		fileIn.getline(buff,500);
		ptr_1 = strtok (buff," ");
		ptr_2 = strtok (NULL," ");
		ptr_3 = strtok (NULL,"\n");
		ptr_4 = strtok (NULL,"\n");
		mas[i].year = atoi(strtok (NULL,""));
		mas[i].number = atoi(strtok (NULL,"\n"));
		i++;
	}
	for(int j=0;j<=i;j++)
	{
		cout<<mas[j].fio.surname<<" "<<mas[j].fio.name<<" "<<mas[j].fio.second_name<<endl;
		cout<<mas[j].adress<<endl;
		cout<<mas[j].year<<endl;
		cout<<mas[j].number<<endl;
	}
	return i;
}

void Telephon::Dobavit()		
{
	int c=LoadFile();
	char control[1];
    fprintf(f,"\n************************\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;
	}
}
Вот код...ошибок компилятор не выдает,только warnings...А при запуске программы вылезает ошибка непонятная...
Alik-Soldier вне форума Ответить с цитированием
Старый 27.05.2009, 19:51   #14
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Приложите пример исходного файла (telephon.txt).

И скажите, для чего вот это?
Код:
ptr_1 = (char *) &mas[i].fio.surname;
		ptr_2 = (char *) &mas[i].fio.name;
		ptr_3 = (char *) &mas[i].fio.second_name;
		ptr_4 = (char *) &mas[i].adress;
читайте прямо в массив.

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

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

Цитата:
И скажите, для чего вот это?
Код:

ptr_1 = (char *) &mas[i].fio.surname;
ptr_2 = (char *) &mas[i].fio.name;
ptr_3 = (char *) &mas[i].fio.second_name;
ptr_4 = (char *) &mas[i].adress;
читайте прямо в массив.
Если читаю прямо в массив то ошибка:

cannot convert from 'char *' to 'char [100]'

Цитата:

Что за ошибка?
http://s58.radikal.ru/i160/0905/7e/c1dddbff78bd.jpg

Исходный файл представляет собой что то типа такого:
http://www.rapidshare.ru/1055262

http://s61.radikal.ru/i171/0905/85/19984f25cf8b.jpg

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

Картинки уменьшите!
Или сделайте превью, раз на радикал залили.

А файл могли бы и здесь приложить.

--------
Вы по-прежнему используете stdio!
А вот здесь:
Код:
fileIn.getline(buff,500);
ничего не читаете, т.к. у вас даже файл не открыт.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

Сори,я не вижу картинку...у миня как будто пустое место...
А почем файл не открыт?
Код:
int Telephon::LoadFile()
{
	FILE *f=fopen("telephon.txt", "r");
.....................
Он же здесь вроде открывается...
Alik-Soldier вне форума Ответить с цитированием
Старый 27.05.2009, 20:31   #18
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Alik-Soldier
Он же здесь вроде открывается...
А вы перечитайте еще раз мой совет про использование fstream.
fileIn и f никак между собой не связаны.
stdio и Си-файлы вообще уберите из программы.
Или используйте только их (без fstream)
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

Код:
FILE *f=fopen("telephon.txt", "r");
	if((f=fopen("telephon.txt","r"))==NULL)
        cout<<"Cannot open file"<<endl;
	char buff[500];
	int i=0;
	while(!feof(f))
	{	
		char *ptr_1, *ptr_2, *ptr_3, *ptr_4; 
		ptr_1 = (char *) &mas[i].fio.surname;
		ptr_2 = (char *) &mas[i].fio.name;
		ptr_3 = (char *) &mas[i].fio.second_name;
		ptr_4 = (char *) &mas[i].adress;
		fgetc(f);
		ptr_1 = strtok (buff," ");
		ptr_2 = strtok (NULL," ");
		ptr_3 = strtok (NULL,"\n");
		ptr_4 = strtok (NULL,"\n");
		mas[i].year = atoi(strtok (NULL,"\n"));
		mas[i].number = atoi(strtok (NULL,"\n"));
		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;
Сделал тогда так...Но все та же ошибка...

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

Код:
fgetc(f);
Вы сами улавливаете смысл этой строчки?

---------------
У вас данные об одном человеке записаны в несколько строк. Значит вам нужно считать несколько строк. Понимаете? + одна мусорная строка (из звездочек), которая не используется, но которую тоже нужно прочитать.

А вместо вот этого:
Код:
char *ptr_1, *ptr_2, *ptr_3, *ptr_4; 
		ptr_1 = (char *) &mas[i].fio.surname;
		ptr_2 = (char *) &mas[i].fio.name;
		ptr_3 = (char *) &mas[i].fio.second_name;
		ptr_4 = (char *) &mas[i].adress;
и этого:
Код:
ptr_1 = strtok (buff," ");
		ptr_2 = strtok (NULL," ");
		ptr_3 = strtok (NULL,"\n");
		ptr_4 = strtok (NULL,"\n");
Копируйте напрямую в массив с помощью strcpy.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
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