Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
33
Добавлен:
17.04.2013
Размер:
119.3 Кб
Скачать

Функция продолжения поиска файла findnext

Прототип функции:

int findnext ( struct ffblk *buffer );

Функция findnext используется для поиска следующего файла, имя которого подходит под регулярное выражение, заданное как аргумент для последнего вызова функции findfirst. Структура, заполняемая при вызове функции, содержит информацию, необходимую для продолжения поиска. На каждый последующий вызов функции findnext будет возвращаться новое имя файла до тех пор, пока не возникнет такая ситуация, что не останется более ни одного файла, имя которого подходило бы под заданное регулярное выражение. Поиск происходит только в пределах каталога.

Функция возвращает значение 0 при успешном поиске и значение -1, если файл не найден.

Пример использования функций findfirst и findnext.

Выведем на экран все файлы с расширением cpp из текущего каталога.

#include <dir.h>

#include <dos.h>

#include <conio.h>

#include <stdio.h>

void main()

{

clrscr(); // очистка экрана

ffblk f; // структура ffblk

char *path=new char[20]; // регулярное выражение

strcpy(path,"*.cpp");

/* поиск первого файла с расширением cpp */

int a=findfirst(path,&f,FA_DIREC);

while(!a) // цикл пока файл не найден

{

puts(f.ffnane); // печать имени файла

a=findnext(&f); // продолжить поиск

}

} // конец функции main

Описание некоторых других функций, обеспечивающих работу с каталогами, приведено в приложении.

Строка аргументов

Как и любая другая функция, написанная на языке С++, функция main может иметь аргументы. Эти аргументы передаются функции main через командную строку. В этом случае функция main должна иметь вид :

void main ( int argc, char *argv[ ] )

Параметр argc определяет общее количество передаваемых аргументов.

Параметр argv представляет собой массив адресов, каждый элемент которого указывает на строковое представление соответствующего по порядку аргумента, передаваемого программе. Первый элемент массива argv (т.е. argv[0]) всегда содержит имя программы, по которому она была вызвана. Этот элемент всегда заполнен, поэтому значение argc всегда равно, по крайней, мере 1.

Задать значения аргументов командной строки можно либо из MS-DOS, например: D>prim.exe test.txt, где prim.exe имя файла исполняемой программы, а test.txt имя второго аргумента; либо из интегрированной среды Borland 3.1: пункт меню Run, подпункт Arguments.

Примеры программирования

Пример 1.

Вывести на экран информацию о файлах с расширением, указанным в строке аргументов, по мере создания файлов. Если расширение не указано, то выбрать расширение cpp .

Текст программы.

#include <stdio.h>

#include <conio.h>

#include <dos.h>

#include <string.h>

#include <dir.h>

void main(int argc,char *argv[])

{ struct DIR{

char name [13]; // имя файла

long size; // размер

int data; // дата создания

int time; // время создания

};

struct list{

DIR inf; // информация о файле

list *next; // адрес следующей информации

};

/* описание переменных */

list *Dir=NULL,*pntr,*p,*min;

DIR dir;

ffblk ff;

char *path=new char[35];

/* формирование имени файла для поиска */

if(argc==1)strcpy(path,"*.cpp");

else {

strcpy(path,"*.");

strcat(path,argv[1]);

}

/* поиск файлов и заполнение одно-связанного списка

информацией о файлах */

int a= findfirst(path,&ff,FA_DIREC &&FA_ARCH);

while(!a)

{ pntr=new list;

if(Dir == NULL ) Dir=pntr;

else p->next=pntr;

strcpy(pntr->inf.name,ff.ff_name);

pntr->inf.size=ff.ff_fsize;

pntr->inf.data=ff.ff_fdate;

pntr->inf.time=ff.ff_ftime;

pntr->next=NULL;

p=pntr;

a=findnext(&ff);

}

/* сортировка одно-связанного списка по дате создания файлов */

p=Dir;

while (p!=NULL)

{ pntr=p;

min=p;

while(pntr!=NULL)

{ if(pntr->inf.data<min->inf.data)min=pntr;

pntr=pntr->next;

}

dir=min->inf;

min->inf=p->inf;

p->inf=dir;

p=p->next;

}

/* печать односвязанного списка с информацией о файлах */

clrscr();

printf(" имя файла размер дата\n\n");

while(Dir!=NULL)

{ printf(" %-15s %ld %d\n",Dir->inf.name,

Dir->inf.size,

(( Dir->inf.data&0177000)>>9)+1980);

p=Dir;

Dir=Dir->next;

delete p;

}

}

Соседние файлы в папке Lab6