Mam program, który otwiera plik i sprawdza jego długość.plain C: otwarcie katalogu z fopen()
FILE* fd = fopen(argv[1], "rb");
fseek(fd, 0, SEEK_END);
size_t flen = ftell(fd);
if (flen == ((size_t)-1)) {
printf("%s is a directory.\n", argv[1]);
fclose(fd);
exit(1);
}
Teraz, przynajmniej pod Linuksem, fopen()
zwraca poprawny deskryptor pliku podczas otwierania katalogu. Powoduje to, że operacja wyszukiwania zwraca -1
(lub, jako size_t
, jest niepodpisana, 0xFFFFFFFF
w systemie 64-bitowym).
Niestety, warunek w powyższym kodzie (flen == ((size_t)-1)
) nie przechwytuje tego przypadku, podobnie jak flen == 0xFFFFFFFF
. printf()
- Polecenia z %x
ord %d
jako ciąg formatu pokazują, że obie strony porównania powinny mieć tę samą wartość.
Dlaczego operator porównania zachowuje się w tak dziwny sposób, nawet jeśli obie strony są tego samego typu (size_t
)? Używam gcc 4.8.1 jako kompilatora.
Nie masz na myśli 'sizeof (size_t) -1'? –
@ScottyBauer Nie, nie robi tego. –
Również "PLIK fd" ma postać "PLIKU * fd". A 'ftell()' nie zwraca 'size_t', ale' long'. I -1 nie jest '0xFFFFFFFF' na 64-bitowym (przy założeniu uzupełnienia 2), ale' 0xFFFFFFFFFFFFFFFF'. –