ahmed.o.mohamed

اختبر قدراتك في C/CPP - الحلقة الثالثة, الجزء الرابع

4 ردود في هذا الموضوع

السلام عليكم

الحلقة الأولى.

الحلقة الثانية - الجزء الأول.

الحلقة الثانية - الجزء الثاني.

الحلقة الثانية - الجزء الثالث.

الحلقة الثانية - الجزء الرابع.

الحلقة الثانية - الجزء الخامس.

الحلقة الثانية - الجزء السادس و الأخير.

الحلقة الثالثة - الجزء الأول.

الحلقة الثالثة - الجزء الثاني.

الحلقة الثالثة - الجزء الثالث.

مرحبا بكم إخوتي الكرام في الجزء الرابع من الحلقة الثالثة من سلسلة اختبر قدراتك, قمتُ بتقسيم الحلقة الثالثة إلى عدة أجزاء, مُرتبة حسب الصعوبة. أجزاء هذه الحلقة ستكون خاصة بالتعامل مع الملفات.

سؤالنا هذه المرة يتعلق بالبحث عن ملفات معينة وفقا للتعابير المنطقية (Regular expressions).

لا تقلقوا !, فالسؤال في منتهى البساطة .. :happy:

الإختبار الثالث (الجزء الرابع) :

اكتب برنامج يطلب من المستخدم إدخال تعبير منطقي ثم يُظهر جميع الملفات المتوافقة مع التعبير المُدخل.

يُفضل أيضا إظهار:

  • معلومات عن الملفات. (الإسم, الحجم, الإمتداد, ...)
  • المسار الحالي.
  • عدد الملفات الموجودة في المجلد الرئيسي.

للتبسيط, نفترض أن البرنامج يبحث داخل المجلد الحالي فقط (نستثني المجلدات الفرعية).

مثال :

post-219439-044247300 1347140883_thumb.p

سأضع حل السؤال بعد إنتهاء عرض المحاولات.

تم تعديل بواسطه أحمد الشنقيطي
إرفاق المثال.
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

حسنا, سأبدأ بمحاولاتي هذه المرة :)

محاولة رقم 1 : (استخدمتُ البنية ffblk)

#include <dir.h>
#include <stdio.h>
#include <string.h>

char *current_directory(char *path) {
strcpy(path, "X:\\");
path[0] = 'A' + getdisk();
getcurdir(0, path + 3);
return (path);
}

int main() {
struct ffblk ffblk;
char curdir[MAXPATH], regEx[20];
int done;
current_directory(curdir);
printf("Répertoire courant : [ %s ]\n", curdir);
printf("Affichage des fichiers : \n");
printf("Reg Exp : ");
scanf("%s", regEx);
done = findfirst(regEx, &ffblk, NULL);
while (done != -1) {
printf("\t%s\t%u\t(Octets)\n", ffblk.ff_name, ffblk.ff_fsize);
done = findnext(&ffblk);
}
return 0;
}

المُخرجات :

post-219439-081546800 1347183466_thumb.p

محاولة رقم 2 : (استخدمتُ البنية dirent)

#include <time.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>

int main() {

printf("Chemin du fichier source : [ %s ]\n\n", __FILE__);
char dir[30];
printf("Chemin du reprertoire : ");
scanf("%s", dir);

DIR *rep = opendir(dir);
if (rep != NULL) {
printf("Affichage des fichiers : \n");
struct dirent *lecture;
while ((lecture = readdir(rep))) {
struct stat st;
stat(lecture->d_name, &st);
{
time_t t = st.st_mtime;
struct tm tm = *localtime(&t);
char s[32];
strftime(s, sizeof s, "%d/%m/%Y %H:%M:%S", &tm);
printf("%-14s %s\n", lecture->d_name, s);
}
}
closedir(rep), rep = NULL;
}
return 0;
}

المُخرجات :

post-219439-085965600 1347183474_thumb.p

محاولة رقم 3 : (استخدمتُ بعض دوال الــ API)

#include <windows.h>
#include <iostream>
using namespace std;

string ExePath() {
char buffer[MAX_PATH];
GetModuleFileName(NULL, buffer, MAX_PATH);
string::size_type pos = string(buffer).find_last_of("\\/");
return string(buffer).substr(0, pos);
}

int lister_fichier() {
WIN32_FIND_DATA ffd;
HANDLE hFind;
LPCTSTR dir = "C:\\*";
hFind = FindFirstFile(dir, &ffd);
if (hFind == INVALID_HANDLE_VALUE) {
cout << "La fonction FindFirstFile() a echouee. (" << GetLastError() << ")" << endl;
return 1;
} else {
while (FindNextFile(hFind, &ffd) != 0)
cout << ffd.cFileName << endl;
FindClose(hFind);
}
return 0;
}

int main() {
cout << "Repertoire en cours : [ " << ExePath() << " ]" << endl << endl;
cout << "Affichage des fichiers et dossiers du disque dur C : " << endl << endl;
lister_fichier();
}

المُخرجات :

post-219439-027258200 1347183484_thumb.p

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#define BigInt unsigned long long

HANDLE hFind;
WIN32_FIND_DATA fd;
char regex[24] = "?i*.*", path[256] = ".\\";
SYSTEMTIME st;
int main() {
GetCurrentDirectory(256, path);
printf("Directory: %s\n", path);
printf("regex: %s\n\n%-30s%-24s%s\n", regex, "File name", "Size", "Creation time");
strcat(path, path[strlen(path)-1]=='\\'?"":"\\");
strcat(path, regex);
hFind = FindFirstFile(path, &fd);
while(hFind&&FindNextFile(hFind, &fd))
if(!(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)){
FileTimeToSystemTime(&fd.ftCreationTime, &st);
printf("%-30s%-14llu (octets) %04d/%02d/%02d %02d:%02d:%02d\n", fd.cFileName, (BigInt)fd.nFileSizeLow + (BigInt)fd.nFileSizeHigh * 65536, st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
}
FindClose(hFind);
_getch();
return 0;
}

Directory: E:\Windows
regex: ?i*.*

File name Size Creation time
diagerr.xml 1908 (octets) 2012/03/27 07:38:03
diagwrn.xml 1908 (octets) 2012/03/27 07:38:03
DirectX.log 103830 (octets) 2011/10/19 08:12:55
mib.bin 43131 (octets) 2009/07/14 00:10:29
win.ini 478 (octets) 2009/07/14 02:34:57
WindowsShell.Manifest 749 (octets) 2009/07/14 04:54:24
WindowsUpdate.log 1220758 (octets) 2005/06/15 21:59:52
winhlp32.exe 9728 (octets) 2009/07/14 00:12:29

تم تعديل بواسطه khatibe_30
2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

تم منح النقاط للمشاركات المفيدة و حذف الردود الغير مفيدة, حفاظا على تنسيق الموضوع.

يُغلق.

أراكم في الجزء الخامس و الأخير من الحلقة الثالثة.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .