wopen i linux?
wopen i linux?
i windows finns funktionen wopen som tar emot wide-char sträng som filnamn. Vad heter motsvarigheten i linux?
-
- Inlägg: 6191
- Blev medlem: 14 jan 2007, 19:31
- OS: Ubuntu
- Utgåva: 22.10 Kinetic Kudu
- Ort: Stockholm
SV: wopen i linux?
Motsvarigheten heter fopen(), oavsett teckenkodning.
SV: wopen i linux?
fopen använder ju FILE objektet, och jag vill nyttja open som returnerar integer.
-
- Inlägg: 6191
- Blev medlem: 14 jan 2007, 19:31
- OS: Ubuntu
- Utgåva: 22.10 Kinetic Kudu
- Ort: Stockholm
SV: wopen i linux?
Ja, men använd open() då
Den är också oberoende av teckenkodning.

SV: wopen i linux?
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
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

-
- Inlägg: 6191
- Blev medlem: 14 jan 2007, 19:31
- OS: Ubuntu
- Utgåva: 22.10 Kinetic Kudu
- Ort: Stockholm
SV: wopen i linux?
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.
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?
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.
http://www.opengroup.org/onlinepubs/007 ... har.h.html innehåller mycket info om wchar funktionerna för posix system.
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
}
The Black Mountain Scorpion Hoedown Bluegrass Experience Gang
From Left to Right: Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle.
From Left to Right: Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle.