Problem beim INI auslesen (Newbie)



  • Guten Tag

    Ich versuche verzweifelt folgende *.ini Datei auszulesen:

    timeout=333
    batch=C:\blubb.bat
    

    Dazu verwende ich untenstehenden Code. Das Problem ist dass ich eine 0 ausgegeben bekomme statt einer 333. Kann mir jemand helfen?

    #include <cstdlib>
    #include <iostream>
    #include <stdio.h>
    #include <string>
    using std::string;
    char inifilecontent [100];
    unsigned int * timeout;
    
    FILE * inifile;
    
    int main(int argc, char *argv[])
    {
        inifile = fopen ("C:\\test.ini","r");
        if (inifile!=NULL)
        {
    
           while ( fgets(inifilecontent, 100, inifile) != NULL);
           {
                 sscanf(strtok(inifilecontent,"timeout="),"%d",timeout);
                 printf ("%d",timeout);
           }
    
        fclose (inifile);
        }
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    


  • zunächst einmal: warum verwendest du die stdio.h und die iostream.h??
    Entscheide dich erst einmal, was du machst, entweder C, oder C++
    Wenn du in C++ arbeitest, würde ich an deiner Stelle mit fstream arbeiten.
    Also z.b.:

    #include <fstream.h>
    #include <iostream.h>
    

    Dann gib ich dir nen Tipp: Niemals (Nur, wenn es nicht anders geht) mit globalen Variablen arbeiten.
    Also:

    int main ()
    {
         char infilecontent[100];
         unsigned int *timeout;
         fstream infile;
         infile.open("C:\\Test.ini",ios::in);
         if(infile.good())
         {
                   while(!eingabe.eof())
                   {
                           eingabe.getline(infilecontent,100);
                           cout<<infilecontent<<endl;
                   }
         }
         else cout<<"Fehler beim Oeffnen!"<<endl;
         infile.close();
         if(!infile.good())
         {
               cout<<"Fehler beim Schliessen!"<<endl;
         }
         System("PAUSE");
         return EXIT_SUCCESS;
    }
    

    So würde ich des schreiben zum Auslesen der Daten, die in der infile stehen, weiß auch nicht, warum du die Daten auf einen Pointer schreibst, des könntest du mal erklären



  • fstream.h
    iostream.h

    sind veraltet. verwende die "ohne .h" aus dem namespace std;

    schau dir noch die klasse string aus dem namespace std an.

    schau auch mal ins c++-faq unter ströme von hume sikkins.



  • Vielen Dank für die Antworten. Ich sehe ich muss mich präzisieren.
    Zunächst einmal habe ich so gut wie keine C/C++ Erfahrungen und ausser diesem kleinen Projekt werde ich in nächster Zeit auch nicht mehr damit konfrontiert da mein Tätigkeitsbereich sich auf HTML/CSS/PHP beschränkt.

    Nur für das laufende PHP Projekt (eine Computer Inventar Datenbank) brauche ich einen Dienst der in gewissen Zeitabständen eine Batchdatei startet, welche wiederum das Inventar Tool (Everest von Lavalys) startet. Das funktioniert auch alles soweit.

    Hier der Code des (funktionierenden) Dienstes:

    #include <windows.h>
    #include <tchar.h>
    #include <shellapi.h>
    
    TCHAR* serviceName = TEXT("EverestReportService");
    SERVICE_STATUS serviceStatus;
    SERVICE_STATUS_HANDLE serviceStatusHandle = 0;
    HANDLE stopServiceEvent = 0;
    
    void WINAPI ServiceControlHandler( DWORD controlCode )
    {
    	switch ( controlCode )
    	{
    		case SERVICE_CONTROL_INTERROGATE:
    			break;
    
    		case SERVICE_CONTROL_SHUTDOWN:
    		case SERVICE_CONTROL_STOP:
    			serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
    			SetServiceStatus( serviceStatusHandle, &serviceStatus );
    
    			SetEvent( stopServiceEvent );
    			return;
    
    		case SERVICE_CONTROL_PAUSE:
    			break;
    
    		case SERVICE_CONTROL_CONTINUE:
    			break;
    
    		default:
    			if ( controlCode >= 128 && controlCode <= 255 )
    				// user defined control code
    				break;
    			else
    				// unrecognised control code
    				break;
    	}
    
    	SetServiceStatus( serviceStatusHandle, &serviceStatus );
    }
    
    void WINAPI ServiceMain( DWORD /*argc*/, TCHAR* /*argv*/[] )
    {
    	// initialise service status
    	serviceStatus.dwServiceType = SERVICE_WIN32;
    	serviceStatus.dwCurrentState = SERVICE_STOPPED;
    	serviceStatus.dwControlsAccepted = 0;
    	serviceStatus.dwWin32ExitCode = NO_ERROR;
    	serviceStatus.dwServiceSpecificExitCode = NO_ERROR;
    	serviceStatus.dwCheckPoint = 0;
    	serviceStatus.dwWaitHint = 0;
    	serviceStatusHandle = RegisterServiceCtrlHandler( serviceName, ServiceControlHandler );
    
    	if ( serviceStatusHandle )
    	{
    		// service is starting
    		serviceStatus.dwCurrentState = SERVICE_START_PENDING;
    		SetServiceStatus( serviceStatusHandle, &serviceStatus );
    
    		// do initialisation here
    		stopServiceEvent = CreateEvent( 0, FALSE, FALSE, 0 );
    
    		// running
    		serviceStatus.dwControlsAccepted |= (SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
    		serviceStatus.dwCurrentState = SERVICE_RUNNING;
    		SetServiceStatus( serviceStatusHandle, &serviceStatus );
    
    		do
    		{   
                //Beep( 1000, 100 );                
                ShellExecute(NULL, "open", "cmd.exe", "/c \\\\vechbs-S9001\\inventory$\\InventoryShedule.cmd", NULL, SW_HIDE);
    
    		}
    		while ( WaitForSingleObject( stopServiceEvent, 3600000 ) == WAIT_TIMEOUT );
    
    		// service was stopped
    		serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
    		SetServiceStatus( serviceStatusHandle, &serviceStatus );
    
    		// do cleanup here
    		CloseHandle( stopServiceEvent );
    		stopServiceEvent = 0;
    
    		// service is now stopped
    		serviceStatus.dwControlsAccepted &= ~(SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
    		serviceStatus.dwCurrentState = SERVICE_STOPPED;
    		SetServiceStatus( serviceStatusHandle, &serviceStatus );
    	}
    }
    
    void RunService()
    {
    	SERVICE_TABLE_ENTRY serviceTable[] =
    	{
    		{ serviceName, ServiceMain },
    		{ 0, 0 }
    	};
    
    	StartServiceCtrlDispatcher( serviceTable );
    }
    
    void InstallService()
    {
    	SC_HANDLE serviceControlManager = OpenSCManager( 0, 0, SC_MANAGER_CREATE_SERVICE );
    
    	if ( serviceControlManager )
    	{
    		TCHAR path[ _MAX_PATH + 1 ];
    		if ( GetModuleFileName( 0, path, sizeof(path)/sizeof(path[0]) ) > 0 )
    		{
    			SC_HANDLE service = CreateService( serviceControlManager,
    							serviceName, serviceName,
    							SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
    							SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, path,
    							0, 0, 0, /*Username*/ "VECHBS-D00\\everestjob", /*Password*/ "*********" );
    			if ( service )
    				CloseServiceHandle( service );
    		}
    
    		CloseServiceHandle( serviceControlManager );
    	}	
    }
    
    void UninstallService()
    {
    	SC_HANDLE serviceControlManager = OpenSCManager( 0, 0, SC_MANAGER_CONNECT );
    
    	if ( serviceControlManager )
    	{
    		SC_HANDLE service = OpenService( serviceControlManager,
    			serviceName, SERVICE_QUERY_STATUS | DELETE );
    		if ( service )
    		{
    			SERVICE_STATUS serviceStatus;
    			if ( QueryServiceStatus( service, &serviceStatus ) )
    			{
    				if ( serviceStatus.dwCurrentState == SERVICE_STOPPED )
    					DeleteService( service );
    			}
    
    			CloseServiceHandle( service );
    		}
    
    		CloseServiceHandle( serviceControlManager );
    	}
    }
    
    int _tmain( int argc, TCHAR* argv[] )
    {
    	if ( argc > 1 && lstrcmpi( argv[1], TEXT("install") ) == 0 )
    	{
    		InstallService();
    	}
    	else if ( argc > 1 && lstrcmpi( argv[1], TEXT("uninstall") ) == 0 )
    	{
    		UninstallService();
    	}
    	else
    	{
    		RunService();
    	}
    
    	return 0;
    }
    

    Das konnte ich mir soweit copyen,pasten,ändern,erweitern.

    So nun möchte der Chef aber dass er das timeout für den Dienst, der momentan fix bei 3600000 ms liegt, über eine .ini Datei einstellbar ist. Genau so die ausgeführte Batchdatei. Dabei habe ich an eine gettimeout() und eine getbatchpath() gedacht.

    Sorry wenn ich keinen Plan habe aber ich bin noch in der Lehre 🙂

    Naja wäre echt super wenn mir da jemand aus der Patsche helfen könnte.



  • So wies aussieht suchst du ne windows-only Lösung. In diesem Fall kann ich dir
    verraten, das es zum Lesen von INI-Dateien spezielle WINAPI-Funktionen gibt.
    Such mal in deiner MSDN nach GetPrivateProfileString() u.ä.. Dort solltest du
    das Passende finden.



  • gringo schrieb:

    unsigned int * timeout;
    // ...
    sscanf(strtok(inifilecontent,"timeout="),"%d",timeout);
    

    Du hast da einen uninitialiserten Zeiger.

    Benutze statt dessen eine int-Variable und übergib bei sscanf deren Adresse.


Anmelden zum Antworten