2015-11-18 2 views
0

Я начинаю на C и учась, когда я прогрессирую. Я принял и изменил программу для печати имен файлов в каталоге в отсортированном порядке. Я только хотел бы напечатать первый и последний файл в отсортированном порядке. (например: c.txt, z.docx, f.jpg, a.docx: Выход будет a.docx и z.docx)Улучшение печати Имя и фамилия отсортированного каталога

Directory Size: Почти 2000000 Файлы
Размер файла: Каждый размер на большинство 2MB

Препятствия
Первое название печатает как "." и второе имя «..»
Сортировка осуществляется через верхний регистр, как переключиться на нижний регистр

Было бы здорово знать, если есть более простой и более эффективный способ выполнения кода ниже.

#include <stdio.h> 
#include <stdlib.h> 
#include <dirent.h> 

int 
main(void) 
{ 
    struct dirent **namelist; 
    int n; 
    int i = 0; 

    n = scandir(".", &namelist, NULL, alphasort); 
    if (n < 0) 
    { 
     perror("scandir"); 
    } 
    else 
    { 
     while (i<n) 
     { 
      if (i == 0) // First Name 
      { 
       printf("%s\n", (namelist[i])->d_name); 
      } 
      if (i == n-1) // Last Name 
      { 
       printf("%s\n", (namelist[i])->d_name); 
      } 
      free(namelist[n]); 
      i++; 
     } 
     free(namelist); 

    } 
} 
+0

Вы можете напечатать первый и последний перед циклом while(), и упростить цикл только до 'free()' memory. Вы должны также проверить, есть ли более 1 файла перед печатью последней записи. –

ответ

0

Может быть, если вы удалите а часть и распечатать только третий (в disconsider и ...) И последний вход:

#include <stdio.h> 
#include <stdlib.h> 
#include <dirent.h> 

int 
main(void) 
{ 
    struct dirent **namelist; 
    int n; 
    int i = 0; 

    n = scandir(".", &namelist, NULL, alphasort); 
    if (n < 0) 
    { 
     perror("scandir"); 
    } 
    else 
    { 

     printf("%s\n", (namelist[2])->d_name); 
     printf("%s\n", (namelist[n-1])->d_name); 

     while(i<n) 
      free(namelist[i++]); 
     free(namelist); 
    } 
    return 0; 
} 

И не забывайте return 0; Как вы указали, вы должны вернуть int в свою основную часть. Теперь вы можете печатать свои материалы в постоянное время, но для сохранения памяти все еще нужно освободить Θ (n). Если вы хотите disconsider скрытых файлов, которые вы должны добавить функцию фильтра, как (начиная с «»):

int filter(const struct dirent *entry) { 
    return entry->d_name[0] != '.'; 
} 

и добавить его в scandir аргументы

scandir(".", &namelist, filter, alphasort); 

, а затем вы должны изменяющим первым print index, потому что '.' и «..» будет обрабатываться фильтром.

printf("%s\n", (namelist[0])->d_name); 
+0

Как я могу убедиться, что элементы нижнего регистра являются первыми, а верхний - вторым. Например (выход Aa.txt и aa.txt должен быть aa.txt, Aa.txt. Это не должно быть Aa.txt, aa.txt, который в настоящее время происходит) –

Смежные вопросы