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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2011, 12:50   #1
Andrey_k
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 11
По умолчанию Аналог функции fscanf (C++)

Здравствуйте.
По заданию нужно написать аналог функции fscanf на языке C++. Каким способом это можно реализовать: построчное чтение с помощью fgets с разбором строки, посимвольное чтение с помощью fread или есть какой-нибудь более простой способ?
Полного решения я не требую, хотелось бы понять как это лучше сделать.
Заранее спасибо.
Andrey_k вне форума Ответить с цитированием
Старый 26.02.2011, 13:07   #2
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Используй для этого ifstream.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 26.02.2011, 13:34   #3
Andrey_k
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 11
По умолчанию

Спасибо, попробую

Можно ли в ifstream использовать форматирование считываемых данных? То есть чем заменить спецификаторы форматов, которые используются в fscanf?

Последний раз редактировалось Stilet; 26.02.2011 в 14:37.
Andrey_k вне форума Ответить с цитированием
Старый 26.02.2011, 14:39   #4
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Там это происходит автоматически, то есть тип того, что оно пытается считать, зависит от типа того, что надо считать.

Короче, я тут прикинул — видимо в задании подразумевается, что ты будешь использовать scanf, вот и всё. То есть забей на ifstream (тем более, как я понял, вы потоки C++ не проходили и пока работаете с вводом-выводом в стиле C). Надеюсь, с использованием snanf проблем не будет.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 26.02.2011, 14:58   #5
Andrey_k
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 11
По умолчанию

Задание в оригинале звучит так:"Реализовать внутренности функции в среде разработки Microsoft Visual C++". Преподаватель сказал что под "внутренностями" следует понимать возможную реализацию данной функции.
Насчёт функции scanf я уже думал, но она читает из стандартного потока, а нужно из файла как fscanf. Получается наверно что кроме fread никак.
Andrey_k вне форума Ответить с цитированием
Старый 26.02.2011, 15:12   #6
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Имелось в виду sscanf(), всё время их путаю.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 26.02.2011, 15:45   #7
Andrey_k
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 11
По умолчанию

Спасибо. Кажется это то что нужно.
Andrey_k вне форума Ответить с цитированием
Старый 10.03.2011, 19:59   #8
Andrey_k
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 11
По умолчанию

Оказывается sscanf не подходит, нужно написать всю реализацию данной функции самому. Нужно создать функцию, которая принимает такие же параметры как fscanf, то есть указатель на поток, формат, список аргументов. Получается функция с переменным количеством аргументов. Как получать значение из подобных аргументов я разобрался, но вот записать туда не получается.
Например есть функция
Код:
int myfunction(FILE* stream, char *format, ...)
{
	va_list ap;
	char *p, *sval;
	int ival;
	double dval;

	//Выдеоение слова
        char a='\0';
	vector<char> str;
	fread(&a,sizeof(char),1,stream);
	while (!feof(stream) && a!=' ')
	{
		str.push_back(a);
		fread(&a,sizeof(char),1,stream);
	}
	char* str1=(char*)calloc(str.size()+1, sizeof(char));
	for (int i=0; i<str.size(); i++)
		str1[i]=str.at(i);
	str1[str.size()]='\0';

       //Работа с переменными, в которые нужно записать значения
	va_start(ap, format); 
      for (p = format; *p; p++) {

          switch (*++p) {
          case 'd':
              ival = va_arg(ap, int); //???
	      ival=atoi(str1);
              break;
          case 'f':
              dval = va_arg(ap, double); //???
	      ival=atof(str1);
              break;
          case 's':
              for (sval = va_arg(ap, char *); *sval; sval++) //???
                  sval=str1;
              break;
          }
      }
      va_end(ap); 
	  return 0;
}
Как вернуть полученные значения не через return?
Andrey_k вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аналог функции fscanf для дельфи? VLAD2 Помощь студентам 1 07.01.2011 15:31
Аналог функции ЧИСТРАБДНИ Mint86 Microsoft Office Excel 16 14.05.2010 09:55
Аналог функции ЧИСТВНДОХ Mint86 Microsoft Office Excel 7 13.05.2010 08:41
аналог функции case redfield Microsoft Office Excel 3 05.05.2010 12:25
Аналог функции WriteProcessMemory KleoY Win Api 10 31.03.2009 01:17