[C++] Pliki INI - problem z wczytywaniem

0

Witam! Zająłem się ostatnio plikami INI. Wszystko wporzo, ale mam problem. Program działa jak należy, ale tylko z BCB, z Windowsa już jest błąd. Nie jestem u siebie i piszę taką prościutką grę. I w FormCreate dałem kod:

GetPrivateProfileString("Options", "graphic", "error", imgPath, sizeof(imgPath), GetCfgPath());
    first_time = GetPrivateProfileInt("Options", "first_time", 1, GetCfgPath());
	try
    {
    	img->Picture->LoadFromFile(imgPath);
    }
    catch(...)
    {
    	ShowMessage("Błąd przy wczytywaniu obrazku!" + AnsiString(imgPath));
        Application->Terminate();
    }
    if (first_time)
	ShowMessage("Witaj po raz pierwszy w programie! Sprawdzisz tutaj swój czas reakcji. Kliknij na start, a gdy pojawi się obrazek kliknij w niego.");
    WritePrivateProfileString("Options", "first_time", " 0", GetCfgPath());
	startTime = 5;

Kod GetCfgPath():

char *GetCfgPath()
{
	char CurrentDir[_MAX_PATH];
    char cfgPath[256], cfgName[256];
    strcpy(cfgName, "config.em");

    GetCurrentDirectory(sizeof(CurrentDir), CurrentDir);
    strcpy(cfgPath, CurrentDir);
    strcat(cfgPath, "\\");
    strcat(cfgPath, cfgName);

   	return cfgPath;
}

GetCfgPath() zwraca ścieżkę pliku INI, który u mnie ma rozszerzenie *.em (każde raczej działa, próbowałem nawet *.mp3 u siebie i wczytuje). Ścieżkę podaje dobrą. I wychodzi na to, że plik INI jest nie poprawny. Jego treść:

[Options]
graphic = img.bmp
first_time = 0

I niestety nie działa wczytywanie wartości graphic z Windowsa. Obsługę przejmuje catch(...) i komunikat "Błąd...". Z Builder wszystko w porządku i gra działa. Co jest źle w kodzie lub pliku? Pomocy!

0

Nie jestem pewna czy to to, ale w ini raczej nie powinno być spacji dookoła '='.

0

Sprawdzę to, ale pamiętam u siebie działało mi ze spacją. Jak bd działać napiszę..

0

Mam wątpliwości co do funkcji GetCfgPath.
Zwracasz tam wskaźnik do zmiennej lokalnej cfgPath która już nie istnieje po wyjściu z tej funkcji, moim zdaniem nie wolno ci tak zrobić. Zainteresuj się klasą np. std::string

a jeżeli chodzi o błąd to ja bym stawiał na to co napisałem powyżej albo na problem z bieżącym katalogiem, w sensie wartość z pliku .ini wczytuje się dobrze tylko katalog roboczy aplikacji jest źle ustawiony i błąd pochodzi z metody img->Picture->LoadFromFile która nie może znaleŹć pliku.

0

To samo, nic nie dało usunięcie spacji. Dodam jeszcze, że kompilator wykazuje ostrzeżenie "W8075 Suspicious pointer conversion" w miejscu zwracania wyniku funkcji GetCfgPath().

0

Z góry przepraszam za post pod postem, ale nie zarejestrowany jestem ;/

Ma ktoś propozycję jak to zrobić bez tego warninga? Wiem, że to pokićkane jest, ale nie mogłem nic wymyśleć i jak dałem * to zadziałało ;P A jak wykorzystać string, nie do końca wiem, bo jak kiedyś próbowałem to kicha, ponieważ w funkcjach Get... są potrzebne parametry w char *

0

Np. Tak
Zauważ użycie magicznej metody c_str()

AnsiString GetCfgPath()
{
    char CurrentDir[_MAX_PATH];
    char cfgPath[256], cfgName[256];
    strcpy(cfgName, "config.em");
 
    GetCurrentDirectory(sizeof(CurrentDir), CurrentDir);
    strcpy(cfgPath, CurrentDir);
    strcat(cfgPath, "\\");
    strcat(cfgPath, cfgName);
 
    return AnsiString(cfgPath);
}


GetPrivateProfileString("Options", "graphic", "error", imgPath, sizeof(imgPath), GetCfgPath().c_str());
0

o.O Działa! Nie tylko funkcja, ale program ;) Dzięki kolego. A co do tego, że problem tkwił w Load... to odpadał, bo funkcja GetPrivate... zwracała defaulta "error". Jeszcze raz dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1