File öffnen



  • Hallo zusammen,

    ich habe eine Frage. Ich möchte einen File öffnen das ich weiter bearbeiten möchte ich zeige euch das mal am besten:

    char* pOffsetFileName;
    //This function read the offset file.
    //Input: char* pOffsetFileName - file to read
    
    void Interpolator::ReadOffsetFile(char* pOffsetFileName)
    {
    	//open the file
    	FILE* pInFile = fopen(pOffsetFileName, "r");
    	if (pInFile == NULL)
    	{
    		m_ErrorType = BAD_OFFSET_FILE;
    		return;
    	}
    
    	//Allocate memory for m_pTimeDistArray
    	m_pTimeDistArray = new int [m_pSampledMotion->m_NumFrames];
    
    	int frameNum, frameNumPrev = 0;
    	//read the file
    	for (int i = 0; i < m_pSampledMotion->m_NumFrames; i++)
    	{
    		//read next line
    		if (fscanf(pInFile, "%d", &frameNum) == -1)
    		{
    			m_ErrorType = BAD_OFFSET_FILE;
    			return;
    		}
    
    		//Compute offset and store into array
    		//offset = number of frames skipped between frame i and i-1
    		m_pTimeDistArray[i] = frameNum - frameNumPrev - 1;	
    		frameNumPrev = frameNum; 
    
    	}
    }
    

    Das ist eine Programmier Aufgabe, ich möchte hierbei die Varible mit der Funktion fopen initialisieren. Krige das irgendwie nicht so hin, kann mir da jemand mal bitte unter die Arme greifen ?

    Grüße

    tyson



  • Dieser Thread wurde von Moderator/in estartu aus dem Forum MFC (Visual C++) in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Mmmh. Der code sieht gut aus, wobei der richtige C++-Programmierer std::fstream nehmen würde. Was ist denn genau dein Problem?



  • Hallo nochmal zusammen,

    ich sollte die Frage mal ein wenig anders stellen. Ich bin nicht so sehr vertraut mit C++.
    Es geht hierbei im "Interplotion" im Bereich Computer Animation, die Aufgabe besteht darin, dass ich eine "Animation" bekomme, wo z.B. ein Männeken am laufen ist und während die Animation läuft soll ich eine andere Animation hochladen, mit einem anderen Verhalten z.B. er geht diesmal rückwärts.
    Das Ziel ist es die übergänge der beiden Animationen so "geschmeidig" wie möglich zu machen, d.h. zu Interpolieren.

    Ich versuche gerade dem Button "Interpolate" mitzuteilen, dass er eine Funktion aufrufen soll. Das sieht folgerdermaßen aus.

    Der Konstruktor

    Interpolator::Interpolator(Motion* pSampledMotion, char* pOffsetFileName)
    {
        //Set default interpolation type
        m_InterpTypeToUse = LINEAR;
    
        //set default angle representation to use for interpolation
        m_AngleRepresToUse = EULER;
    
        //Set motion to be interpolated
        m_pSampledMotion = pSampledMotion;
    
        //Set ErrorType to NO_ERROR
        m_ErrorType = NO_ERROR_SET;
    
        //Init m_pTimeDistArray array
        m_pTimeDistArray = NULL;
        ReadOffsetFile(pOffsetFileName);
    }
    

    die Funktion ich aufrufen möchte: zuerst die erste und danach die zweite

    void Interpolator::ReadOffsetFile(char* pOffsetFileName)
    {
    	//open the file
    	FILE* pInFile = fopen(pOffsetFileName, "r");
    	if (pInFile == NULL)
    	{
    		m_ErrorType = BAD_OFFSET_FILE;
    		return;
    	}
    
    	//Allocate memory for m_pTimeDistArray
    	m_pTimeDistArray = new int [m_pSampledMotion->m_NumFrames];
    
    	int frameNum, frameNumPrev = 0;
    	//read the file
    	for (int i = 0; i < m_pSampledMotion->m_NumFrames; i++)
    	{
    		//read next line
    		if (fscanf(pInFile, "%d", &frameNum) == -1)
    		{
    			m_ErrorType = BAD_OFFSET_FILE;
    			return;
    		}
    
    		//Compute offset and store into array
    		//offset = number of frames skipped between frame i and i-1
    		m_pTimeDistArray[i] = frameNum - frameNumPrev - 1;	
    		frameNumPrev = frameNum; 
    
    	}
    }
    
    //Create interpolated motion
    void Interpolator::Interpolate(Motion*& pInterpMotion) 
    {
    	//Do nothing if error is set
    	if (m_ErrorType != NO_ERROR_SET)
    	{
    		pInterpMotion = NULL;
    		return;
    	}
    
    	//Compute number of frames int the new (interpolated) motion 
    	int nNumFrames = 0;
    
    	//Count all skipped frames
    	for (int i = 0; i < m_pSampledMotion->m_NumFrames; i++)
    		nNumFrames += m_pTimeDistArray[i];
    
    	//Add number of frames on the sampled file
    	nNumFrames += m_pSampledMotion->m_NumFrames;
    
    	//Allocate new motion - initially set to default motion
    	pInterpMotion = new Motion(nNumFrames); 
    
    	//Perform the interpolation
    	if (m_InterpTypeToUse == LINEAR && m_AngleRepresToUse == EULER)
    		LinearInterpEulerAngles(pInterpMotion);
    	else
    	{
    		//For now only linear interpolation of euler angles is supported
    		m_ErrorType = NOT_SUPPORTED_INTERP_TYPE;
    		delete pInterpMotion;
    		pInterpMotion = NULL;
    		return;
    	}
    }
    

    Jetzt meine Frage ich mein die Frage ist wohl für den einen oder anderen ziemlich einfach, aber ich kenne mich halt nicht so sehr damit aus:
    Ich möchte meinem Button" Interpolate sagen" dass er eines Funktionen aufrufen soll, aber beim erzeugen des Objektes habe ich meine Probleme

    static Motion *pSampledMotion = NULL;    
    // Motion information as read from AMC file
    
    //Interpolate loaded motion using linear interpolation
    void interpolate_callback(Fl_Button *button, void *) 
    {
        interpolate_button->value(); ??
        Interpolator neu = new Interpolator(pSampledMotion,????????);
    
    }
    

    Ich mein mein Konstruktor hat 2 Parameter, ich weiss hier nicht wie ich diesen 2 Parameter bestimmen kann. Ich kann sagen ok, fopen usw. aber in der Funktion ReadOffsetFile wird ja so ein File geöffnet ?

    Habt Ihr meine Frage verstanden ???

    Würd mich freuen wenn ihr mir helfen könntet...

    Grüße



  • und Ausserdem wieso bekomme ich eine Fehlermeldung wenn ich einen Objekt erzeugen möchte mit dem Konstruktor :

    Interpolator::Interpolator(Motion* pSampledMotion, char* pOffsetFileName)
    {
    	//Set default interpolation type
    	m_InterpTypeToUse = LINEAR;
    
    	//set default angle representation to use for interpolation
    	m_AngleRepresToUse = EULER;
    
    	//Set motion to be interpolated
    	m_pSampledMotion = pSampledMotion;
    
    	//Set ErrorType to NO_ERROR
    	m_ErrorType = NO_ERROR_SET;
    
    	//Init m_pTimeDistArray array
    	m_pTimeDistArray = NULL;
    	ReadOffsetFile(pOffsetFileName);
    }
    

    ich versuche einen Objekt zu erzeugen, indem ich:

    static Motion *pSampledMotion = NULL;
    char* OffsetFile = "text.txt";
    
    //Interpolate loaded motion using linear interpolation
    void interpolate_callback(Fl_Button *button, void *) 
    {
    	interpolate_button->value();
    	Interpolator neu = new Interpolator(pSampledMotion, OffsetFile);
    }
    

    Die Fehlermeldung die ich bekomme ist :

    --------------------Configuration: key_frame1 - Win32 Debug--------------------
    Compiling...
    player.cxx
    C:\Dokumente und Einstellungen\Resul\Desktop\Partition\BILKENT\Computer Animation\Motion Capture\Acclaim\asf_amc_viewer 1-18-2005\viewer\player.cxx(202) : error C2440: 'initializing' : cannot convert from 'class Interpolator *' to 'class Interpolato
    r'
    No constructor could take the source type, or constructor overload resolution was ambiguous
    Error executing cl.exe.

    key_frame1.exe - 1 error(s), 0 warning(s)


Anmelden zum Antworten