PDA

View Full Version : کار بافایل



shahpari
سه شنبه 06 فروردین 1387, 11:02 صبح
با سلام و تبریک سال نو خدمت همه دوستان

من می خوام درباره کار با فایل اطلاعات به دست بیارم

جستجو هم کردم ولی واقعا هیچ مطلب مفیدی پیدا نشد برای نمونه چند تا از لینک ها رو
میزارم که با دیدنش حتما شما هم به درستی حرفم پی می برید

http://barnamenevis.org/forum/showthread.php?t=74050&highlight=%DA%A9%D8%A7%D8%B1+%D8%A8%D8%A7+%D9%81%D 8%A7%DB%8C%D9%84
http://barnamenevis.org/forum/showthread.php?t=91236&highlight=%DA%A9%D8%A7%D8%B1+%D8%A8%D8%A7+%D9%81%D 8%A7%DB%8C%D9%84
http://barnamenevis.org/forum/showthread.php?t=58271&highlight=%DA%A9%D8%A7%D8%B1+%D8%A8%D8%A7+%D9%81%D 8%A7%DB%8C%D9%84

لطفا اگه pdf ی یا مطلب مفیدی دارید به ما تازه وارد ها هم بگید

ممنون

misterxsib
سه شنبه 06 فروردین 1387, 16:59 عصر
این (http://barnamenevis.org/forum/showpost.php?p=292560&postcount=2)پست که مثال خوبی بود چرا می گید چیز بدرد بخوری پیدا نکردم.

misterxsib
سه شنبه 06 فروردین 1387, 17:15 عصر
basic file operations
#include <iostream>
#include <fstream>
using namespace std;
int main () {
ofstream myfile;
myfile.open ("example.txt");
myfile << "Writing this to a file.\n";
myfile.close();
return 0;
}

ICEMAN
سه شنبه 06 فروردین 1387, 18:16 عصر
کتاب C++ How to program رو بخون تا کام روا بشی !
chm ش رو میتونی راحت پیدا کنی

shahpari
سه شنبه 06 فروردین 1387, 19:05 عصر
سلام از راهنمایی هر دو دوست عزیز تشکر می کنم

ولی بازم مشکلم حل نشده

ببینید من می خوام با فایل یه برنامه دیکشنری بنویسم

این کدهای بالایی رو هم امتحان کردم ولی مشکلم حل نشده

به این دلیل که می خوام محتویات فایل مثل access مرتب باشه که من راحت بتونم یه لغت رو جستجوکنم

ممنون

atilla snowman
پنج شنبه 08 فروردین 1387, 01:48 صبح
دوست عزیز من
کاری که میخوای بکنی کاریه که من سال پیش میخواستم بکنم. باید تصمیم بگیری که میخوای کارتو ساده انجام بدی یا خوب. اگه اولی رو انتخاب کردی بهتره از یه فایل متنی استفاده کنی که کار باهاش شبیه کار با console هستش و ایجاد و دستکاری اون واقعا سادست. اگه دومی رو انتخاب کردی باید از یه فایل باینری استفاده کنی که فرمت اون رو خودت درست میکنی و انحصاری برنامه ی خودته. یا میتونی از فرمتهای استاندارد که وجود دارند پیروی کنی که خودت یکیشو گفتی که احتمالا مجبور میشی بری دنبال فرمتها و باید کاملا بفهمیشون. من در مورد جزییات مورد آخر اطلاعاتی ندارم. فقط باید بگم که بعضی شرکتهای تا حدودی باز این اطلاعات رو در مورد فرمتهاشون در اختیار برنامه نویسایی مثل تو میذارن.
در نهایت توصیه ی من یه فرمت ساده و بهینست یا استفاده از hash table که سرعت جستجوتو به order 1 کاهش میده و البته حجم فایلاتو افزایش میده. فرمت خود ساخته ی خودت هم میتونه ایندکس گذاری بشه و کارتو ساده کنه.
به هر حال استفاده از فایل باینری خودساز دردسر داره که یکی از اونا محدودیت تو سایز رکوردها و سربار اضافیه که تو باید تحملش کنی که در نهایت کارت بدون عیب از آب در میاد.
هر روشی که انتخاب کردی بگو تا شاید کمکی از من یا سایرین بر بیاد.
موفق باشی.

misterxsib
پنج شنبه 08 فروردین 1387, 09:55 صبح
ببینید شما از نوشتن دیکشنری یا باید هدفتون آموزش باشه یا باید هدفتون در آوردن یه چیز خوب باشه:
اگه هدف اول مد نظرتونه همون فایل باینری به نظرم بهتر باشه و atilla snowman (http://barnamenevis.org/forum/member.php?u=39307) درست میگن انتخاب فرمت ذخیره با خودتونه.
ولی اگه هدفتون دومیه c++ گزینه خوبی واسه این کار نیست.الان دیگه واسه بانک های اطلاعاتی از برنامه های خیلی قویتر و آماده ای استفاده می شه.

shahpari
پنج شنبه 08 فروردین 1387, 11:37 صبح
سلام

با این تفاسیر فکر میکنم بهتره از فایل باینری فرمت خود ساخته استفاده کنم

اگه اطلاعات بیشتری بدید ممنون میشم.

misterxsib
پنج شنبه 08 فروردین 1387, 18:12 عصر
مثلا برای خوندن اطلاعات از یه فایل باینری:


#include <iostream>
#include <fstream>
using namespace std;
ifstream::pos_type size;
char * memblock;
int main () {
ifstream file ("example.txt", ios::in|ios::binary|ios::ate);
if (file.is_open())
{
size = file.tellg();
memblock = new char [size];
file.seekg (0, ios::beg);
file.read (memblock, size);
file.close();
cout << "the complete file content is in memory";
delete[] memblock;
}
else cout << "Unable to open file";
return 0;
}



برای نوشتن هم:


file.write (memblock, size);

memory_block همون اشاره گر کاراکتری قبلیه.

ios::ate مکان نمای ورود رو به انتهای فایل می فرسته تا با tellg() سایزشو بدست بیاریم.متغیر size‌رو از نوع ifstream::pos_type تعریف کرده بودیم.البته می شد از این کد هم برای این کار استفاده کرد:


int size;
size = (int) file.tellg();

بعد بافر رو به اندازه کل فایل در نظر رفتیم تا جا کم نیاریم برای کار شما باید دید یه کلمه تو دیکشنری چقدر میتونه طویل باشه.

sasan_vm
پنج شنبه 08 فروردین 1387, 18:44 عصر
سلام



با این تفاسیر فکر میکنم بهتره از فایل باینری فرمت خود ساخته استفاده کنم


پکیجی که در این تاپیک معرفی شده http://barnamenevis.org/forum/showthread.php?t=24701 می تونه ایده خوبی برای طراحی بانک اطلاعاتی توسط برنامه نویس باشه (خود کد هم قابل استفاده و کامل هست).
ولی پیشنهاد بهتر استفاده از یکی از RDBMS ها است (SQL-Server, MySql,...) در صورتی که در برنامه استفاده از RDBMS ممکن نیست پیشنهاد دوم dbisam است این هم سایتش:
http://www.elevatesoft.com/dbisam_prodinfo.htm

موفق باشید.

shahpari
پنج شنبه 08 فروردین 1387, 21:54 عصر
از دوستان ممنون

فکر میکنم برای شروع یه آشنایی رو به دست آوردم

اگر به مشکل برخوردم حتما از اطلاعات دوستان توی همین تاپیک استفاده می کنم

atilla snowman
یک شنبه 11 فروردین 1387, 00:56 صبح
با سلام مجدد.
امیدوارم که با فرمت خودت مشکل پیدا نکنی.
منظورم از فرمت این بود که باید بایت به بایت فایلتو با دقت بنویسی و بدونی که مثلا ایندکست یا تعداد مدخلهات دقیقا کجا (کدوم بایت) کجا ذخیره کردی. سادگی توی بازیابی اطلاعاتت خیلی مهمه. به علاوه کار اصلیت به نظر من اینه که باید اطلاعاتی که از تو فایلت به صورت یه رشته (احتمالا آرایه کاراکتریت) خوندی بتونی به نوع داده ی مورد نظرت تبدیل کنی. در واقع استفاده از فایلهای مناسب برای cast هات سرعتت رو بالا میبره. نمیدونم این توابع رو میشه چطوری میشه پیدا کرد. من یه بار یه تعدادی نوشتم که اگه نتونستی مسالتو با cast ها حل کنی واسط میفرستم.