Typ pliku - struktura stat

0

Mam taki kod (kawałek funkcji, która zwraca typ pliku - bardziej by chyba pasowało rodzaj, ale mniejsza o to):

struct stat buf;
stat(sciezka.c_str(), &buf);

Typ TypPliku = EMP;

if (S_ISLNK(buf.st_mode))
	TypPliku = LNK;

if (S_ISREG(buf.st_mode))
	TypPliku = REG;

if (S_ISDIR(buf.st_mode))
	TypPliku = DIR;

if (S_ISCHR(buf.st_mode))
	TypPliku = CHR;

if (S_ISBLK(buf.st_mode))
	TypPliku = BLK;

if (S_ISFIFO(buf.st_mode))
	TypPliku = FIFO;

if (S_ISSOCK(buf.st_mode))
	TypPliku = SOCK;

return TypPliku;

Chodzi o to, że ilość ifów mi się nie podoba. Jest jakiś sposób, by ją zmniejszyć? Istnieje coś takiego w stat.h?

0

Tak jest sposob, elementom enum'u Typ daj wartosci takie jak maja flagi rodzaju pliku i po sprawie. Inny sposob, napisz funkcje odwzorowywujaca rodzaje na Twoj Typ.

0
t0m_k napisał(a)

Inny sposob, napisz funkcje odwzorowywujaca rodzaje na Twoj Typ.

To właśnie jest taka funkcja.

0
yoel napisał(a)

To właśnie jest taka funkcja.

Nie zrozumiales. Ten typ Typ jak sie domyslam jest zwyklym enum'em, a jak to z enum'ami bywa kazdy jego element ma przypisana wartosc, ktora reprezentuje jego nazwa. W przykladzie ktory podales uzywasz nazw elementow tego enuma. Piszac napisz funkcje odwzorowywujaca mialem bardziej na mysli napisanie czegos co zamapuje flage na wartosc typu Typ, ale jest to bez sensu rozwiazanie, poniewaz wystarczy ze przypiszesz elementom typu Typ wartosci takie jak maja flagi okreslajace rodzaj pliku.

Spojrz na to, wycinek z stat.h:

#define S_ISLNK(m)	(((m) & S_IFMT) == S_IFLNK)
#define S_ISREG(m)	(((m) & S_IFMT) == S_IFREG)
#define S_ISDIR(m)	(((m) & S_IFMT) == S_IFDIR)
#define S_ISCHR(m)	(((m) & S_IFMT) == S_IFCHR)
#define S_ISBLK(m)	(((m) & S_IFMT) == S_IFBLK)
#define S_ISFIFO(m)	(((m) & S_IFMT) == S_IFIFO)
#define S_ISSOCK(m)	(((m) & S_IFMT) == S_IFSOCK)

To sa te funkcje sprawdzajace, czyli cos czego nie potrzebujesz, poniewaz wystarczy zrobic takie makro, oczywiscie uprzednio przydzielajac elementom Typ odpowiednie wartosci.

#define S_GETTYPE(m) ((m) & S_IFMT)

Makro obliczy Ci wartosc flagi rodzaju pliku, ktora mozesz rzutowac na element Typ i zwrocic.

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