![]() |
Кучка (heap)
Здравствуйте!
Меня интересует как в программе на Си обрабатывать кучу файлов, заданных по маске параметром командной строки как один входной источник? (файлы не копируются друг в друга! в любой момент времени мы должны точно значть из какого именно файла мы считываем) Синтаксис запуска, например, таков: myprogram.exe *.TEXT При таком запуске программа должна обрабатывать в качестве входного потока все файлы с расширением .TEXT, которые лежат в папке с ней. Товарищи Керниган и Ритчи предлагают только filecopy... (( |
ManHack, дык, перечислите все файлы в папке, чтобы узнать их кол-во, а после выделите память(можно и кучи можно через VirtualAlloc, зависит от конкретного примера) для таблицы, которая будет содержать структуры следующего типа:
Код:
opened_file struc Ну, и далее по обстоятельствам. |
Вот про указатели на память со считанным файлом можно поподробнее?
Каким образом это реализуется на Си? Я понимаю что есть "указатель на файл", но фраза "указатель на память" вносит некое смятение в мои мысли. Проясните пожалуйста. |
ManHack, я вам не скажу, как это делается именно на Си, т.к. не пишу на этом языке, но на WinAPI это делается следующим образом:
1. Открываем файл с помощью CreateFile 2. Узнаём размер файла с помощью GetFileSize 3. Выделяем нужное кол-во памяти через VirtualAlloc, основываясь на полученном размере файла 4. И считываем открытый файл в эту память при помощи ReadFile Вот у вас и получился указатель на память, содержащую считаный файл. А что такое указатель на файл? Его описатель(который handle)? Если да, то понятие указатель здесь несовсем подходит. |
Спасибо! Но я слышал, что в Си можно совершенно стандартным образом обрабатывать кучу файлов по маске.
Например, в Паскале есть команда, возвращающая первый файл из директории, которые подпадает под заданную маску (к примеру, какую-нибудь такую: ABS*.PAS) Также там есть команда, которая позволяет получить следующий файл, удовлетворяющий такой маске из той же директории. А далее можно организовать цикл... В Си тоже есть что-то аналогичное и тоже совершенно стандартное, но упоминаний в руководствах об этом я не нашёл. Хотелось бы разузнать как такие вещи реализуются именно на Си... |
Цитата:
либо findfirst, findnext (dir.h) в любом случае стандартными их назвать можно только для windows и dos. В юниксе не прокатят. виндовые функции упоминаются в руководстве msdn, а так же помогает поиск в инете по их названиям. Ещё пишут что аналогично работает opendir, который есть в юниксе, но меня описание не впечатлило. А я бы посоветовал, если обработка файлов ведётся независимо, сделать в программе так, чтобы она принимала названия файлов со входного потока, и запускать её так: dir /s /b /a-d *.pas | my_program один косяк: у винды глюкавый dir. Если он встретит папку 1.pas, то перечислит всё её содержимое. В юниксе таких проблем нет. |
pva, для Юникса по идеи должен помочь исходник ls.
|
так и есть, а моя любимая - find и/или grep
|
На славу потрудившись, я написал следующий код:
Код:
void ResetText() { Теперь проблема: скармливаю я ему, значит, консольный ввод: Код:
MyProgram.exe InputFile.txt Цитата:
PS> Как из WIN32_FIND_DATA конвертировать, скажем, в формат массива из символов? |
1) что такое Path? откуда он взялся?
2) посоветую изначально занулить WIN32_FIND_DATA 3) насколько я помню, cFileName - это и есть массив из MAX_PATH_LENGTH символов (а не указатель), поэтому Цитата:
|
Написал совсем по-человечески:
O.C Код:
/* Љ®¬ЇЁ«пв®а п§лЄ* Ћ (o.c) */ Код:
char ResetError = TRUE; Теперь первый файл по маске программа читает нормально, а вот когда под маску подпадают несколько файлов, то когда дело доходит до второго возникает ошибка: ![]() Ошибка возникает на втором файле, т.к. я пробовал выводить значение переменной Path когда они присваиваются - выдало 1-е имя файла из папки, удовлетворяющее маске и 2-е, потом ошибка. В чём причина неполадки? Почему программа не хочет обрабатывать последующие файлы? (их имена она определяет правильно) При компиляции проекта в MS Visual Studio 2008 ошибок не возникало... Помогите. |
Время: 20:16. |
Время: 20:16.
© OSzone.net 2001-