C, gnomevfs, anjuta und unicode



  • Hi! Ich habe ein Problem mit gnomevfs und (schätz ich mal) unicode. Der folgende Code funktioniert nicht. Er sollte eigentlich den ersten Buchstaben aus einer Textdatei (inhalt "hello world", ohne die hochkommata) ausgeben, also das "h".

    #include <stdio.h>
    #include <libgnomevfs/gnome-vfs.h>
    
    #define BUF_SIZE 1
    
    int main()
    {
       GnomeVFSHandle *handle;
       GnomeVFSResult result;
       GnomeVFSFileSize bytes_read;
    
       GString *pfad;
       gchar buffer[BUF_SIZE];
    
       pfad = g_string_new(gnome_vfs_get_uri_from_local_path("/home/tim/test.txt"));
    
       // Gnome-VFS initialisieren
       gnome_vfs_init();
    
       result = gnome_vfs_open(&handle, pfad->str, GNOME_VFS_OPEN_READ);
    
       if (result == GNOME_VFS_OK)
       {
          result = gnome_vfs_read(handle, buffer, BUF_SIZE, &bytes_read);
          if (result == GNOME_VFS_OK)
             g_print(buffer);
       }
    
       result = gnome_vfs_close(handle);
    
       gnome_vfs_shutdown();
    
       return (0);
    }
    

    Die Ausgabe ist jedoch folgende:

    [Invalid UTF-8] h\x90\xa0\x04\x08\x01"
    

    Noch etwas, wenn ich versuche das projekt in anjuta zu kompilieren bekomme ich ein paar Fehler:

    Datei main.c wird compiliert:...
    gcc -I/usr/lib -Wall -c "main.c" -o "main.o"
    main.c:2:35:libgnomevfs/gnome-vfs.h: Datei oder Verzeichnis nicht gefunden
    

    Wäre schön, wenn mir jemand helfen könnte.
    cu
    TheCurse



  • g_print erwartet vermutlich einen 0-terminierten String. Dein String ist aber nicht 0 terminiert!

    Ansonsten ist es glaube ich eh keine gute Idee byteweise zu lesen, wegen UTF.



  • Naja, aber hast du einen vorschalg, wie ich das sonst machen soll?

    MfG
    TheCurse



  • Übrigens klappt das ganze auch nicht mit printf oder sonstigen konsorten für die ausgabe. Scheint aber kein generelles Problem mit unicode zu sein, da alles mit alter C-Syntax problemlos funktioniert. Hat irgendjemand Ideen, was ich an dem Code abändern müsste, damit alles funktioniert?

    MfG
    TheCurse



  • wie dings schon sagte, der strinng muss 0-terminiiert sein, mahc dasmal...



  • In C enden Strings normalerweise mit einer 0, damit man weiß wo der String aufhört. Nun ist dein String nicht 0-terminiert und die Ausgabe gibt eben solange bytes aus, bis zufällig im Speicher eine 0 erscheint (oder dein Programm mit einem SegFault abbricht). Da vorher einiges an misst kommt, dass für die Terminalemulation wie ein UTF-8 Zeichen aussieht kommt bei dir diese Warnung.

    Häng einfach noch eine 0 an deinen String.

    char str[2];
    str[0]=text();
    str[1]=0;
    print(str);
    

    -Foo- schrieb:

    wie dings schon sagte

    Dings? Welcher Dings? Ich kenne keinen Dings! 😉



  • Ok, hab eine Lösung gefunden. Also entweder gibt man wirklich einen 0-Terminierten String mit g_print aus. Man kann aber auch das Character ausgeben indem man
    g_print("%c", buffer[0]);
    ausführt (z.B.).


Log in to reply