Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание обвертки для fscanf 
V
    Опции темы
Alca
Дата 26.5.2009, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Как можно извратиться? У меня не получается:
Код

int fscanf ( FILE * stream, const char * format, ... );

Код

/* fscanf example */

#include <windows.h>
#include <stdio.h>
#include <string>

using namespace std;
//---------------------------------------------------------------------------
INT iFscanf(FILE *pFile, LPCSTR pcszFormat, ...) {
    INT iRes = EOF;
    
    va_list args = NULL;
    va_start(args, pcszFormat);

    iRes = fscanf(pFile, pcszFormat, args);
    
    va_end(args);

    return iRes;
}
//---------------------------------------------------------------------------
int main () {
    CHAR   str[80] = {0};
    FLOAT  f       = 0.0;
    FILE  *pFile   = NULL;

    pFile = fopen("C:\\myfile.txt","w+");
    fprintf(pFile, "%f %s", 3.1416, "PI");
    rewind(pFile);

    //fscanf(pFile, "%f", &f);
    iFscanf(pFile, "%f", &f);

    //fscanf(pFile, "%s", str);
     iFscanf(pFile, "%s", &str); //iFscanf(pFile, "%f", &f); - накосячил

   

    fclose(pFile);
    
    printf("Expected: I have read: 3.141600 and PI\n");
    printf("Result:   I have read: %f and %s \n", f, str);    


    system("pause");
    return 0;
}
//---------------------------------------------------------------------------

Результат:
Код

Expected: I have read: 3.141600 and PI
Result:   I have read: 0.000000 and


Это сообщение отредактировал(а) Alca - 26.5.2009, 13:04


--------------------
PM WWW ICQ Skype Jabber   Вверх
586
Дата 26.5.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Использовать vfscanf.
PM   Вверх
Alca
Дата 26.5.2009, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Цитата

Использовать vfscanf.

Чего-то здесь я ее не нашел...

Добавлено через 11 минут и 49 секунд
Плдключил:
Код

#include <windows.h>
#include <stdio.h>
#include <string>
#include <cstdarg>
#include <cstdio>

Код

Error    1    error C3861: 'vfscanf': identifier not found    c:\fscanf\umain.cpp    17


Добавлено через 12 минут и 15 секунд
VC++ 2008 без SP1


--------------------
PM WWW ICQ Skype Jabber   Вверх
586
Дата 26.5.2009, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



vfscanf в стандарте C99 есть.

В libc (Linux) есть.
В билдере есть.
В компиляторах MS похоже что нету.

В fscanf всё равно передать параметры не получится - неизвестно количество параметров.
PM   Вверх
Alca
Дата 26.5.2009, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Цитата

В компиляторах MS похоже что нету.

Галимо. smile

Добавлено через 3 минуты и 15 секунд
vfscanf в Visual C++



--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 26.5.2009, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Так 
Код

int vfscanf(FILE  *pFile, const char * format, va_list argList) {
    return fscanf(pFile, format, * (void **) argList);
}

будет правильно?
В моем примере выводиться флоат и не выводиться буфер:  smile 
Код

Expected: I have read: 3.141600 and PI
Result:   I have read: 3.141600 and


Добавлено @ 12:45
Нашел косяк. Вот как бы пабочий код.
Код

/* fscanf example */

#include <windows.h>
#include <stdio.h>
#include <string>
#include <cstdarg>
#include <cstdio>


//---------------------------------------------------------------------------
int vfscanf(FILE  *pFile, const char * format, va_list argList) {
    return fscanf(pFile, format, * (void **) argList);
}
//---------------------------------------------------------------------------
INT iFscanf(FILE *pFile, LPCSTR pcszFormat, ...) {
    INT iRes = EOF;
    
    va_list args = NULL;
    va_start(args, pcszFormat);

    iRes = vfscanf(pFile, pcszFormat, args);
    
    va_end(args);

    return iRes;
}
//---------------------------------------------------------------------------
int main () {
    CHAR   str[80] = {0};
    FLOAT  f       = 0.0;
    FILE  *pFile   = NULL;

    pFile = fopen("C:\\myfile.txt","w+");
    fprintf(pFile, "%f %s", 3.1416, "PI");
    rewind(pFile);

    //fscanf(pFile, "%f", &f);
    iFscanf(pFile, "%f", &f);

    //fscanf(pFile, "%s", str);
    iFscanf(pFile, "%s", &str);    //iFscanf(pFile, "%s", str);

    fclose(pFile);
    
    printf("Expected: I have read: 3.141600 and PI\n");
    printf("Result:   I have read: %f and %s \n", f, str);    


    system("pause");
    return 0;
}
//---------------------------------------------------------------------------

Код

Expected: I have read: 3.141600 and PI
Result:   I have read: 3.141600 and PI

Хочу критики!!!  smile

Добавлено @ 12:49
Теперь vfscanf  есть и в Visual C++ smile 

Это сообщение отредактировал(а) Alca - 26.5.2009, 13:05


--------------------
PM WWW ICQ Skype Jabber   Вверх
xvr
Дата 27.5.2009, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Работать не будет - такой vfscanf просто скопирует к себе 1й параметр из списка, проигнорировав все остальные (если они были).
Сделать из fscanf vfscanf не получится (по крайней мере без ассемблера)

PM MAIL   Вверх
Alca
Дата 27.5.2009, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



У меня этот код выдал правильный результат. smile

Добавлено через 10 минут и 46 секунд
Я делал еще обвертку над sscanf, там дествительно 1й параметр (int) из списка получился правильным, а второй (char[]) был пуст.
C fscanf-ом вроде нормально работает.


--------------------
PM WWW ICQ Skype Jabber   Вверх
xvr
Дата 27.5.2009, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Alca @ 27.5.2009,  14:23)
У меня этот код выдал правильный результат. smile

Для одного параметра - да  smile 
Цитата

Добавлено @ 14:34
Я делал еще обвертку над sscanf, там дествительно 1й параметр (int) из списка получился правильным, а второй (char[]) был пуст.
C fscanf-ом вроде нормально работает.
С точки зрения обработки ... они ничем не отличаются  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0513 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.