Аналог функции Fscanf (c++)

Тема в разделе "C/C++/C#", создана пользователем kan141290, 26 фев 2011.

  1. kan141290

    kan141290 Гость

    Здравствуйте.
    По заданию нужно написать аналог функции fscanf на языке C++. Каким способом это можно реализовать: построчное чтение с помощью fgets с разбором строки, посимвольное чтение с помощью fread или есть какой-нибудь более простой способ?
    Полного решения я не требую, хотелось бы понять как это лучше сделать.
    Заранее спасибо.
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Это не так просто сделать. Вот простой пример, взятый с http://www.go4expert.com/forums/showthread.php?t=8560:
    Код (C++):
    #include "stddef.h"
    #include "stdarg.h"
    #include "stdlib.h"

    extern FILE *Stderr;


    int MyScanf(char *s, const char *fmt, ...)
    {
    char *s0;
    va_list ap;
    long L, *Lp;
    int i, *ip, rc = 0;
    va_start(ap, fmt);
    for(;; ) {
    for(;;) {
    switch(i = *(unsigned char *)fmt++) {
    case 0:
    goto done;
    case '%':
    break;
    default:
    if (i <= ' ') {
    while(*s <= ' ')
    if (!*s++)
    return rc;
    }
    else if (*s++ != i)
    return rc;
    continue;
    }
    break;
    }
    switch(*fmt++) {
    case 'l':
    if (*fmt != 'd')
    bad(fmt);
    fmt++;
    Lp = va_arg(ap, long*);
    L = strtol(s0 = s, &s, 10);
    if (s > s0) {
    rc++;
    *Lp = L;
    continue;
    }
    return rc;
    case 'd':
    ip = va_arg(ap, int*);
    L = strtol(s0 = s, &s, 10);
    if (s > s0) {
    rc++;
    *ip = (int)L;
    continue;
    }
    return rc;
    default:
    bad(fmt);
    }
    }
    done:
    return rc;
    }
    }
     
  3. kan141290

    kan141290 Гость

    lazybiz
    Спасибо! Переделал данный код под свою задачу.
     
Загрузка...

Поделиться этой страницей