Использование fprintf в коде C ++ - PullRequest
1 голос
/ 21 августа 2011

У меня странная проблема.Когда я пытаюсь скомпилировать приведенный ниже код, он работает без сбоев, как и ожидалось:

#include <iostream>
#include <Windows.h>

int main(){
       FILE *f = fopen("trystl.geo","w");
       fprintf(f,"Merge \"trystl.stl\";");
       fprintf(f,"\n");
       fprintf(f,"Surface Loop(2) = {1};");
       fprintf(f,"\n");
       fprintf(f,"Volume(3) = {2};");
       fclose(f);
       return 0;
}

Но когда я пытаюсь подключить эту программу к кнопке с пользовательским интерфейсом FLTK, она выдает ошибку выполнения утверждения.Сегмент моего кода:

void UserInterface::cb_m_BtnSTLToGEOConverter_i(Fl_Button*, void*){
    //OnSTLToGEOConvert();
       FILE *f = fopen("trystl.geo","w");
       fprintf(f,"Merge \"trystl.stl\";");
       fprintf(f,"\n");
       fprintf(f,"Surface Loop(2) = {1};");
       fprintf(f,"\n");
       fprintf(f,"Volume(3) = {2};");
       fclose(f);
}
void UserInterface::cb_m_BtnSTLToGEOConverter(Fl_Button* o, void* v){
    ((UserInterface*)(o->parent()->parent()->parent()->parent()->parent()->parent()->parent()->user_data()))->cb_m_BtnSTLToGEOConverter_i(o,v);   
}

Когда пользователь нажимает кнопку, я хочу, чтобы программа создала файл с именем trystl.geo и выполнила указанные операции.Но при компиляции и открытии программы и нажатии на кнопку появляется:

Ошибка отладки!

Программа: * ....... \ src \ fprintf.c Строка 55:

Выражение: (str! NULL)

отменить попытку или проигнорировать ...

Я использую Visual Studio 2010.

Ответы [ 2 ]

3 голосов
/ 21 августа 2011

Ошибка проста: строка 55 в fprintf.c в VC ++ - это _VALIDATE_RETURN( (str != NULL), EINVAL, -1);, а str - это параметр FILE* (хотя я видел лучше названные переменные).

Для любопытных (я был) _VALIDATE_RETURN определяется следующим образом:

#define _VALIDATE_RETURN( expr, errorcode, retexpr )                           \
    {                                                                          \
        int _Expr_val=!!(expr);                                                \
        _ASSERT_EXPR( ( _Expr_val ), _CRT_WIDE(#expr) );                       \
        if ( !( _Expr_val ) )                                                  \
        {                                                                      \
            errno = errorcode;                                                 \
            _INVALID_PARAMETER(_CRT_WIDE(#expr) );                             \
            return ( retexpr );                                                \
        }                                                                      \
    }

Так что лучше проверяйте, успешен ли ваш вызов fopen () перед попыткой записи в несуществующий файловый дескриптор.

0 голосов
/ 22 августа 2011

ОК, я нашел решение. Единственная проблема заключается в том, что если вы не введете полный путь в программе, файл не откроется. Я заменил

FILE *f = fopen("trystl.geo","w");

с

FILE *f = fopen("c:/Users/anypath/trystl.geo","w");

это работает!

Спасибо за вашу помощь!

...