2016-04-06 19 views
-1

Bir programın ls'ye benzer bir biçimde yazılması. Programımın -S işaretini uygulaması gerekir, bu, ne tür bir dizin belirtilmişse (veya olmasa da geçerli olanı), içeriğini bayt cinsinden sıralar.Scandir'i kullanıp boyuta göre sıralama

Açıkçası, alfabetik sıralamayı scandir ve alphasort ile kolayca yapabilirsiniz (bkz. https://www.cs.cf.ac.uk/Dave/C/node20.html). Benim sorum, scandir'i, içeriklerinin büyüklüğüne göre iki girişi karşılaştıran bir karşılaştırıcı işleviyle kullanıp kullanamayacağınızdır.

Alternatif olarak, karşılaştırıcı işlevi için NULL belirtebilir, sıralanmamış diziye sahip olabilir ve sonra kendimi qsort() işleviyle sıralayabilirim.

Herhangi bir tavsiye çok takdir edilmektedir. Herhangi bir açıklama gerekli, sadece yorumlarda belirtin.

+1

'** #define scandir (const char * dir, yapı dirent *** isimlistesi, int (* sel) (const yapı dirent *), int (* karş) (const yapı dirent olan struct dirent **)); ', iki basamaklı dizin girişlerinde her bir' stat 'kullanan bir karşılaştırıcı işlev yazabilir ve boyutları uygun gördüğünüz şekilde karşılaştırabilirsiniz. Zorluk stat verilerinin önbelleğe alınmasıdır; Bunu yapmak için açık bir yol yoktur, ancak binlerce dosya varsa, muhtemelen her karşılaştırma yaptığınızda iki stat sistemli çağrı yürütmek istemezsiniz. –

+1

Sorunuz nedir? Zaten cevabı biliyorsunuz .. scandir bir karşılaştırıcı işlevi alır, bu yüzden evet doğru karşılaştırıcıyı geçebilirsiniz. –

+0

Eugene, belki de açıklığa kavuşturmalıyım - nokta, karşılaştırıcı işlevinin iki dirent yapısını kabul etmesidir. Direk yapısının, farkında olduğum kadarıyla, bayt cinsinden şeyin boyutunu içermiyor. –

cevap

1

Yorumları bir cevaba dönüştürün.

scandir() POSIX beyanı

int scandir(const char *dir, struct dirent ***namelist, 
      int (*sel)(const struct dirent *), 
      int (*compar)(const struct dirent **, const struct dirent **)); 

olduğundan size iki dizin girişlerinin işaret her biri üzerinde stat() kullanır ve uygun gördüğünüz herhangi bir şekilde boyutlarını karşılaştıran bir karşılaştırma işlevi yazabilirsiniz . Zorluk, stat verilerini önbelleğe almaktır; Bunu yapmak için açık bir yol yoktur, ancak binlerce dosya varsa, muhtemelen her karşılaştırma yaptığınızda iki adet stat() sistem çağrısı yapmak istemezsiniz. vs hızlı takas '.

Bunu düşünüyordum, ama sonra birkaç yüz dosya için bile çok iş yapıldığını düşündüm. Baska öneri?

(belki alphasort())

muhtemelen aa basit karşılaştırıcı ile gider ve veri en scandir() tarafından döndüğünde sonra, dosya adları ve boyutları (ve diğer verileri önbelleğe bir veri yapısının bir dizi oluşturmak olduğunu Karşılaştırmalarınız için istediğiniz gibi) ve ardından veri yapısının dizisi üzerinde qsort() kullanın. beyan yana

İlgili konular