2015-08-10 1 views
0

Я пытался написать функцию обертки для всех операций с файлами. Но мне не удалось реализовать функцию-обертку для fscanf. Моя собственная функция, как это:Есть ли способ реализовать функцию обертки для fscanf?

scan(const char * _Format, ...) 
{ 
    va_list args; 
    va_start(args, _Format); 
    int result = ::fscanf(_ptr, _Format, args); 
    va_end(args); 
    return result; 
} 
+1

[OT]: '_Format' выглядит как [зарезервированный идентификатор] (http://stackoverflow.com/q/228783/3953764) –

ответ

4

Вы должны использовать vfscanf. См. more on vfscanf.

int scan(const char * _Format, ...) 
{ 
    va_list args; 
    va_start(args, _Format); 
    int result = ::vfscanf(_ptr, _Format, args); 
    va_end(args); 
    return result; 
} 
+0

Благодарим за помощь. Но мне не удавалось работать с vfscanf в visual studio. Кажется, в нем нет функции vfscanf. –

+0

@AykutBurakSAFAK, вы приняли мой ответ. Означает ли это, что вы смогли заставить его работать? –

+0

Мне не удалось заставить его работать над моим собственным проектом, но эти решения работают на системах, использующих стандарт C++ 11, поэтому ваш ответ решает проблему, которая является исключительной ситуацией. –

3

В качестве альтернативы использования в vfscanf, которая принимает va_list, вы можете использовать VARIADIC шаблон:

template <typename ... Ts> 
int scan(const char* format, Ts&&... args) 
{ 
    int result = ::fscanf(_ptr, format, std::forward<Ts>(args)...); 
    return result; 
} 
+0

Благодарим вас за помощь, но, похоже, мне нужно использовать более старый стандарт C++, чем C++ 11, поэтому я не могу использовать вариативные шаблоны или vfscanf, которые так раздражают. –

0

Для тех, кто должен использовать более старый стандарт, чем C++ 11 можно реализовать собственная функция vfscanf вроде следующего:

int vfscanf(FILE* file, const char *format, va_list argPtr) 
{ 
    size_t count = 0; 
    const char* p = format; 

    while(1) 
    { 
     char c = *(p++); 
     if (c == 0) 
      break; 

     if (c == '%' && (p[0] != '*' && p[0] != '%')) 
      ++count; 
    } 

    if (count <= 0) 
     return 0; 

    int result; 

    _asm 
    { 
     mov esi, esp; 
    } 

    for (int i = count - 1; i >= 0; --i) 
    { 
     _asm 
     { 
      mov eax, dword ptr[i]; 
      mov ecx, dword ptr [argPtr]; 
      mov edx, dword ptr [ecx+eax*4]; 
      push edx; 
     } 
    } 

    int stackAdvance = (2 + count) * 4; 

    _asm 
    { 
     mov eax, dword ptr [format]; 
     push eax; 
     mov eax, dword ptr [file]; 
     push eax; 

     call dword ptr [fscanf]; 

     mov result, eax; 
     mov eax, dword ptr[stackAdvance]; 
     add esp, eax; 
    } 

    return result; 
} 

Для дальнейшего information.