Sida 1 av 1

wopen i linux?

Postat: 05 okt 2007, 11:16
av steqve
i windows finns funktionen wopen som tar emot wide-char sträng som filnamn. Vad heter motsvarigheten i linux?

SV: wopen i linux?

Postat: 05 okt 2007, 11:40
av Lars
Motsvarigheten heter fopen(), oavsett teckenkodning.

SV: wopen i linux?

Postat: 05 okt 2007, 13:55
av steqve
fopen använder ju FILE objektet, och jag vill nyttja open som returnerar integer.

SV: wopen i linux?

Postat: 05 okt 2007, 14:16
av Lars
Ja, men använd open() då ;) Den är också oberoende av teckenkodning.

SV: wopen i linux?

Postat: 05 okt 2007, 14:28
av steqve
hm..om jag inte missminner mig så deklareras open enligt open( const char *, int )

jag behöver open( const wchar_t*, int), i windows heter den wopen och jag har iskallt räknat med att en dylik funktion skulle finnas i gcc.

Jag har alltså en wide-sträng som skall ned i funktionen. Därav problemet :(

SV: wopen i linux?

Postat: 05 okt 2007, 15:47
av Lars
Hm, jag började läsa på lite om problemet och insåg att det kanske inte är så lätt som jag först trodde. Men första argumentet till open() skickas i alla fall direkt till filsystemet, det sker ingen omvandling av teckenkodningen där. Så du kan skicka t.ex. en UTF-8-sträng till open() på ett system som använder latin-1, men filnamnet kommer ju att se konstigt ut.

Förmodligen använder man wcsnrtombs() för att konvertera till rätt teckenkodning, men jag ska erkänna att jag har väldigt lite erfarenhet av sådana här nymodigheter.

SV: wopen i linux?

Postat: 05 okt 2007, 18:38
av gasol
Intresant problem.

Jag hade inga problem med att konvertera en wchar_t sträng till en char sträng och sedan öppna filer med den. Sedan om filen är laddad med wchar_t data så spelar det ingen roll eftersom du inte ville använda strömmar så läser du ju på byte basis och det ska inte vara några problem så. Det _går_ att sätta strömmar som wchar_t orienterade.


Här är ett program som skriver ut sin egen kod, när sökvägen är sparade som en wchar_t sträng.

Kod: Markera allt

#include <wchar.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>


int wopen(const wchar_t *path, int flags);


int main(int argc, char **argv) {
   int fd;
   wchar_t *path = L"wopen.c";
   char buff[1024];

   memset(buff, 0, 1024);

   fd = wopen(path, O_RDONLY);

   read(fd, &buff, 1024);

   printf("%s\n",buff);

   close(fd);

   
   return 1;

}


int wopen(const wchar_t *path, int flags) {
#define MAX_LEN 256 
   char buff[MAX_LEN];

   /* hoppas att  wcsrtombs sätter errno... */
   if(wcsrtombs(buff, &path, 256, NULL) > 0)
      return open(buff, flags);
   else
      return -1;
#undef MAX_LEN
}
http://www.opengroup.org/onlinepubs/007 ... har.h.html innehåller mycket info om wchar funktionerna för posix system.