gtk ERROR MESSAGE Файл ключа содержит строку, которая не является парой ключ-значение, группой или комментарием - PullRequest
0 голосов
/ 24 ноября 2018

Проблема, с которой я столкнулся при использовании этой функции, заключается в том, что она получает следующую ошибку, если в файле ключа gtk есть ошибка.Он буквально выпрыгивает из функции, возвращающейся обратно в командную строку.

СООБЩЕНИЕ ОБ ОШИБКЕ Файл ключа содержит строку "" ./icon.ico "", которая не является парой ключ-значение, группой или комментарием

iconFile =

"./ icon.ico"

Но это нормально и работает без ошибок

iconFile = "./ icon.ico"

Я искал в интернете, но не смог найти что-либо, связанное с этой ошибкой.Я попытался запустить его через gdb и valgrind, но не смог обнаружить ошибку.

Может кто-нибудь пролить свет на то, что я делаю неправильно?

// *** config.c ***
//  gcc -Wall -Wextra -o config config.c `pkg-config --cflags --libs gtk+-3.0`
#include <gtk/gtk.h>
#include <glib.h>
//#include <stdio.h>

#include <errno.h>
#include <sys/stat.h>

extern gchar *__progname;

int myErrorCheck(gchar **myData);

// create / get CONFIG file configuration
int main(int argc, gchar *argv[])
{

// THESE ARE CONFIG FILE DEFAULT SETTINGS
// MPD HOST SETTINGS
    gchar *mpdHostname    = "localhost";
    gint mpdPortnumber  = 6600;
    gint mpdTimeout     = 30000;

// PLAYLIST SETTINGS
    gchar *rowFont   = "\"Bold 16\"";
    gchar *viewColor = "\"medium slate blue\"";
    gchar *textColor = "\"black\"";

// OTHER SETTINGS
    gchar *windowTitle      = "Selecet MPD Playlist";
    gchar *iconFile     = "\"./icon.ico\"";

// COMMENTS
// this comment goes above MpdHostSettings group header
    gconstpointer HostSettingsComment = " These are the MPD Host parameters for this executable.";

// this comment goes above PlayListSettings  group  header
    gconstpointer PlayListSettingsComment = " These are the MPD Playlist executable parameters.\n Enclose each parameter in quotes (\"\")";

// this comment goes above windowTitle in Other group header
    gconstpointer windowTitleComment = " This is the window title.";

// this comment goes above iconFile in Other group header
    gconstpointer iconFileComment = " This is the window icon.";

// *** End of THESE ARE CONFIG FILE DEFAULT SETTINGS ***

    GKeyFile *key_file;
    GError *error;

    key_file = g_key_file_new();
    error = NULL;

    gchar *cfgFile;
    gchar   *confPath;


// *** COPY LOWER CASE __progname AS UPPER CASE into upper__progname
    gchar *upper__progname = g_ascii_strup(__progname, strlen(__progname));

// *** TEST or CREATE (if needed) the user config file PATHNAME (should be ~/.config/PROGNAME)

// build the config path string
    confPath = g_strconcat(g_get_user_config_dir(),"/", upper__progname,NULL);

    cfgFile = g_strconcat(confPath,"/", __progname,".conf",NULL);

// Does the config path exist? This IS a CRITICAL error.
    if(access(confPath,F_OK | R_OK)) {
    fprintf (stderr, "WARNING: Error opening config path %s : %s. Line number %d\n", confPath, strerror(errno), __LINE__);

// if possible create PATH directory if it does not exist
    if(mkdir (confPath,S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == -1) {
        g_print("Line %d\n", __LINE__);
// should it for some reason not be created
        fprintf (stderr, "Critical: Error creating config path %s : %s. Line number %d\n", confPath, strerror(errno), __LINE__);
        exit(errno);
    }

// WRITE THE DEFAULT CONFIGURATION TO FILE IF CONF FILE HAS TO BE CREATED
// MPD HOST SETTINGS
    g_key_file_set_string(key_file,  "MpdHostSettings", "mpdHostname",   mpdHostname);
    g_key_file_set_integer(key_file, "MpdHostSettings", "mpdPortnumber", mpdPortnumber);
    g_key_file_set_integer(key_file, "MpdHostSettings", "mpdTimeout",    mpdTimeout);

// PLAYLIST SETTINGS
    g_key_file_set_string(key_file, "PlayListSettings", "rowFont",   rowFont);
    g_key_file_set_string(key_file, "PlayListSettings", "viewColor", viewColor);
    g_key_file_set_string(key_file, "PlayListSettings", "textColor", textColor);

// OTHER PARAMETERS
    g_key_file_set_string(key_file, "OtherSettings", "windowTitle",  windowTitle);
    g_key_file_set_string(key_file, "OtherSettings", "iconFile",  iconFile);

// COMMENTS

    g_key_file_set_comment(key_file, "PlayListSettings", NULL, PlayListSettingsComment, NULL);
    g_key_file_set_comment(key_file, "MpdHostSettings", NULL, HostSettingsComment, NULL);
    g_key_file_set_comment(key_file, "OtherSettings", "windowTitle", windowTitleComment, NULL);
    g_key_file_set_comment(key_file, "OtherSettings", "iconFile", iconFileComment, NULL);
//*********************************************************************

// SAVE them to to file
    g_key_file_save_to_file (key_file, cfgFile, &error);
    }  // End of CREATE CFG FILE

// LOAD THE KEYS FROM CONF FILE IF THEIR IS NO ERROR
    if(!g_key_file_load_from_file(key_file, cfgFile, G_KEY_FILE_KEEP_COMMENTS, &error))
    {
    printf("ERROR MESSAGE %s\n", error->message);
    g_debug("%s", error->message);
    g_key_file_free (key_file);
    return 1;
    }

// MPD HOST PARAMETERS
    mpdHostname    = g_key_file_get_string(key_file, "MpdHostSettings", "mpdHostname",   &error);
    mpdPortnumber = g_key_file_get_integer(key_file, "MpdHostSettings", "mpdPortnumber", &error);
    mpdTimeout = g_key_file_get_integer(key_file, "MpdHostSettings", "mpdTimeout",  &error);

// MPD PLAYLIST PARAMETERS
    rowFont    = g_key_file_get_string(key_file, "PlayListSettings", "rowFont",   &error);
    viewColor = g_key_file_get_string(key_file, "PlayListSettings", "viewColor",   &error);
    textColor  = g_key_file_get_string(key_file, "PlayListSettings", "textColor",   &error);
    windowTitle = g_key_file_get_string(key_file, "OtherSettings", "windowTitle", &error);
    iconFile  = g_key_file_get_string(key_file, "OtherSettings", "iconFile",   &error);

// *** PRINT THESE VARIABLES ***
// MPD HOST SETTINGS
    g_print("mpdHostname %s\n",mpdHostname);
    g_print("mpdPortnumber %d\n", mpdPortnumber)  ;
    g_print("mpdTimeout %d\n", mpdTimeout);

// PLAYLIST SETTINGS
    g_print("rowFont %s\n", rowFont);
    g_print("viewColor %s\n", viewColor);
    g_print("textColor %s\n",  textColor);
    g_print("windowTitle %s\n", windowTitle);
    g_print("iconFile %s\n", iconFile);


    g_key_file_free (key_file);
    g_free(error);
    g_free(cfgFile);
    g_free(mpdHostname );

//g_free(mpdPortnumber );
//g_free(mpdTimeout );

    g_free(rowFont );
    g_free(viewColor );
    g_free(textColor );
    g_free(windowTitle );
    g_free(iconFile );

    return 0;
}

1 Ответ

0 голосов
/ 24 ноября 2018

Я нашел свою ошибку.

Проблема в «error-> message» (GError), которое устанавливается функцией «g_key_file_load_from_file ()» в моей подпрограмме проверки ошибок.

 if(!g_key_file_load_from_file(key_file, cfgFile, G_KEY_FILE_NONE, &error))
{
    printf("ERROR MESSAGE %s\n", error->message);
    g_debug("%s", error->message);
    g_key_file_free (key_file);
    return 1;
}

Таким образом, если есть ошибка в файле conf или файл conf не существует, то «g_key_file_load_from_file» возвращает 1 и изящно выходит из функции.Мне не удалось понять, что если в файле conf возникнет ошибка, она также будет помечена здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...