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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2008, 16:22   #1
Horror
Пользователь
 
Регистрация: 02.02.2008
Сообщений: 25
По умолчанию Работа со строками типа Char

Всем привет!
немогу понять что не правельно
есть функция которая возвращет значение
по ключу из файла
пример текстового файла:
Имя=Иван
Фамилия=Иванов
Телефон=911
функция работает так:
char *name;
name=ReadFileKey("Test.ini","Имя");
printf (%s",name);
и функция рабоет возвращет результат:
Иван
___________________
Но почемуто при таком вызове

char *name;
char *soname;
char *tel;
name=ReadFileKey("Test.ini","Имя");
soname=ReadFileKey("Test.ini","Фами лия");
tel=ReadFileKey("Test.ini","Телефон ");
printf (%s %s %s",name,soname,tel);
результат такой:
911
911
911

т.е. возвращет только последние данный
а если так писать то норма:
char *name;
char *soname;
char *tel;
name=ReadFileKey("Test.ini","Имя");
printf (%s ",name);
soname=ReadFileKey("Test.ini","Фами лия");
printf (%s ",soname);
tel=ReadFileKey("Test.ini","Телефон ");
printf (%s ",tel);


ну таки это видимо я не правельно записываю переменные типа чар?

вот весь код:
Код:
#include <conio.h>
#include <stdio.h>
//=============================================================
char *ReadFileKey(const char *filename,char *variable);
//==============================================================
	 char *Adress;
	 char *User;
	 char *Pass;

int main()
{
     Adress=ReadFileKey("Test.ini","adress");
	printf ("%s \n",Adress);

	 User=ReadFileKey("Test.ini","user");
	printf ("%s \n",User);
	
	 Pass=ReadFileKey("Test.ini","pass");
	printf ("%s \n",Pass);
	
	printf (" \n");
	
    printf ("%s \n",Adress);
	printf ("%s \n",User);
	printf ("%s \n",Pass);


	

getch(); 
return 1;
}
//==============================================================
char *ReadFileKey(const char *filename,char *variable)
{
static char bf[1024], ret[1024];
static char *p, *p2;
FILE *f;
if ((f = fopen(filename, "rt")) != NULL)
	while(fgets(bf, 1024, f))
		{
			p = bf;			
			p2 = variable;  
		    while(*p == *p2)
			p++, p2++;
			if (*p2 == '\0')
				{
				while(*p && *p != '=') p++;
				while(*p == '=' || *p == ' ' || *p == '\t') p++;
				p2 = ret;
				while(*p && *p != '\n') *p2++ = *p++;
				*p2 = '\0';
				if (ret) {return ret;} 
				}
		}
return "";
}
Horror вне форума Ответить с цитированием
Старый 02.02.2008, 16:38   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Как static не надо переменные в функции описывать, они тогда сохраняют значение между вызовами.
B_N вне форума Ответить с цитированием
Старый 02.02.2008, 17:09   #3
Horror
Пользователь
 
Регистрация: 02.02.2008
Сообщений: 25
По умолчанию

т.е.

static char bf[1024], ret[1024];
static char *p, *p2;

=>

char bf[1024], ret[1024];
char *p, *p2;

если да (
то ничего не произашло)
так все и осталось!

может я переменные не так инициализируую
проверь плиз!

и вот еще новый вопрос чтобы использовать
MFC
классы
какие надо инклуды подключать?

ПС использую ВизуалСтудиоНет 7 версии
Horror вне форума Ответить с цитированием
Старый 02.02.2008, 17:24   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Возвращать указатели на локальные переменные - бессмысленное занятие. Статические переменные лежат в сегменте и каждый вызов функции пишет (и читает) разные данные в одно и тоже место, поэтому там 911 всё время и выходило. Локальные переменные при вызове функции размещаются в стеке и после выхода из нее нет никакой гарантии, что от них что-то останется, тем более, что компилятор вставляет при входе/выходе в функцию невидимые вызовы специальных функций. Нужно в функции выделять память через alloc, malloc, calloc, new, HeapAlloc, VirtualAlloc и т.д. и возвращать указатель на эту память. Потом, когда она уже не нужна, естественно, ее освобождать. Чтобы в VS "подключить" MFC нужно просто создать проект MFC, во избежание лишней мороки.
B_N вне форума Ответить с цитированием
Старый 02.02.2008, 19:45   #5
Horror
Пользователь
 
Регистрация: 02.02.2008
Сообщений: 25
По умолчанию

Спасибо!
ясно!
В принципе
я почитал про МФК
и там как раз есть те функции которые мне нужны
(типо работа с ини файлами)

как создать и настроить проект
я уже понял!

теперь еще пару вопросов нет ли у когонить
информации
как написать консольное приложение
работающее с FTP сервером
(может новую тему создать? )

я нашел несколько примеров
но там с интерфесом приложения
которые наследуется от графических компонентов
а мне надо имменно консольное!

зарание благодарен!
Horror вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со строками. ViNcHeStEr Помощь студентам 6 29.06.2008 08:14
С, работа со строками Надюха Помощь студентам 2 29.05.2008 13:07
Есть таблица - В ней три поля int, char, char нужно чтобы данные заносились в таблицу Mysql Muahahaha PHP 8 27.03.2008 11:17