PDA

View Full Version : کار با فایلهای ترتیبی در VC++



ali_mohamadi8928
دوشنبه 02 اردیبهشت 1387, 15:08 عصر
با سلام خدمت دوستان ...

اقا من مدتی هست که دنبال روشی برای خوندن فایلهای ترتیبی ( Text Files ) میگردم ولی چیزی دستگیرم نشد ... دیگه مجبور شدم اینجا مطرح کنم ... من میخوام خط به خط بتونم از فایلهای متنی بخونم و یا خط به خط در فایلهای متنی بنویسم ... این کار رو در پاسکال و بیسیک به راحتی انجام میدم ولی در VC++ هنوز چیزی برای این کار پیدا نکردم ...

مثلا در VB


Dim a As String
Open "C:\vars.txt" For Input As #1
Line Input #1, a
MsgBox a
Close #1

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

حالا این کارا رو توی VC++ چه جوری باید انجام بدم ... خیلی ممنون میشم یکی کمک کنه ... مخصوصا مدیران محترم این انجمن ...

منتظر کمکتون هستم :افسرده:

Nima_NF
دوشنبه 02 اردیبهشت 1387, 17:09 عصر
در این مورد مطالب بسیار زیادی در بخش ++C/C وجود دارد که می توانید با جستجوی لغاتی مثل fstream , ofstream , ifstream به آن ها برسید.

و این هم یک نمونه کد:



#include <fstream>
using namespace std;
int main(int argc, char **argv)
{
char strT[120];
ifstream fileTest;
fileTest.open(TEXT("e:\\Forums.txt"));

fileTest.getline(strT, 100);

// other codes
}

A_Salimi
دوشنبه 02 اردیبهشت 1387, 18:21 عصر
با اجازه از دوستان :

برای اینکه در هر مرحله به خط بعد بروید کافیه کافیه r\n\ رو در Buffer مربوطه بنویسین.

به عنوان مثال :



UpdateData();
CFile file;
file.Open(_T("c:\\test.txt"),CFile::modeCreate|CFile::modeWrite);
CArchive ar(&file,CArchive::store);
CString str[3];
str[0] = "Line1";
str[1] = "Line2";
str[2] = "\r\n";
ar<< str[0] << str[2] << str[1];
ar.Close();
file.Close();
UpdateData(FALSE);


بنابراین کافیه بعد از هر ورود رشته اون رو با r\n\ جمع کنین

اگه فرض هم بر این باشه که مثلا شما می خواهید با هر کلیک روی دکمه در خط جدیدی از فایل اطلاعاتی از یک کادر ویرایش نوشته شود :

file رو به صورت private تعریف کنین :




private:
CFile file;



و در تابع OnInitDialog




file.Open(_T("c:\\test.txt"),CFile::modeWrite);


در Event کلیک یک Button هم کد زیر رو قرار بدینm : متغیر مربوط به کادر ویرایش است .




void CTestMFCDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
UpdateData();
CArchive ar(&file,CArchive::store);
ar<<m<<((CString)"\r\n");
ar.Close();
UpdateData(FALSE);
}


و در آخر قبل از بسته شدن فرم file رو ببندین. (WM_CLOSE)




void CTestMFCDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
if (file)
file.Close();
CDialog::OnClose();
}



موفق باشید.

ali_mohamadi8928
دوشنبه 02 اردیبهشت 1387, 22:10 عصر
از دوستان واقعا ممنونم .....

اقا نیما ایا راهی وجود داره که خط مورد نظر هر چند تا کاراکتر داشت رو بخونیم ... دقیقا مثل همون Readln() پاسکال یا همون Line Input بیسیک ؟؟ نمیخوام توی تعداد کراکتر ها محدودیت داشته باشم ... ؟؟؟ اونوقت یک سوال دیگه هم در رابطه با کدتون .... ایا با هر بار اجرا دستور


fileTest.getline(strT, 100);

برنامه به صورت اتوماتیک به خط بعد میره ؟؟؟ مثل همون Readln() پاسکال ؟؟؟

اما در رابطه با جواب دوست عزیز اقای eshgh_82 .... ایا روش استانداردش همینه برای نوشتن هر جمله در یک خط جدا ؟؟؟ ولی من وقتی کد رو اینجوری تغییر دادم نوشته ها ی ریخته شده داخل فایل یکم نامنظم بود .... !!!


CFile file;
file.Open(_T("c:\\ff.txt"),CFile::modeCreate | CFile::modeWrite);
CArchive ar(&file,CArchive::store);
ar<<'sss'<<'\r\n'<<'mmm';
ar.Close();
file.Close();

شکل نوشته شده در فایل


sss
mmm

اگه توجه کنید یک سری فاصله های غیر استاندارد داره .....

اگه راه استاندارد و بهتری وجود داره لطفا راهنمایی کنید ...

A_Salimi
دوشنبه 02 اردیبهشت 1387, 23:11 عصر
ایا روش استانداردش همینه برای نوشتن هر جمله در یک خط جدا ؟؟؟



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

ali_mohamadi8928
دوشنبه 02 اردیبهشت 1387, 23:56 عصر
دوست عزیز من عین کارهایی که گفتین در روش دوم انجام دادم ولی نمیدونم چرا مشکل میگیره ازم :متفکر:

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

A_Salimi
سه شنبه 03 اردیبهشت 1387, 00:35 صبح
در فایل .h این قسمت رو قرار نداده بودید در جایی که کلاس تعریف شده .



private:
CFile file;

ضمنا خودتون فایل متنی رو در درایو c با نام test ایجاد کنید .

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

موفق باشید.

ali_mohamadi8928
سه شنبه 03 اردیبهشت 1387, 14:17 عصر
ممنون دوست خوبم ... مشکل حل ش و فایل اجرا شد ولی ... !!!!!

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

این شکلی میشه شکل نوشته هام



کاراکتر های اول و اخر رو خودش گذاشته .... !!!!!

Nima_NF
سه شنبه 03 اردیبهشت 1387, 16:19 عصر
برای خواندن و نوشتن از متد های CArchive استفاده کنید، به این شکل:



file.Open(_T("c:\\test.txt"), CFile::modeReadWrite);

CArchive ar(&file,CArchive::store);

ar.WriteString( m );
ar.WriteString( "\r\n" );

ar.Close();

file.SeekToBegin();
CArchive arRead(&file, CArchive::load);

CString str1 ;
arRead.ReadString( str1 );


با هر خواندن و نوشتن به مکان جدید خواهید رفت.

در مورد getline برای توابع استاندار C نیز کمی فرق می کند و برای امنیت بیشتر طول را دریافت می کند چرا که اگر بخواهید فایلی با طول زیاد را بخوانید به هر حال تعداد کارکتر های رشته ای که در پارامتر اول قرار می دهید مشخص می باشد،
مثلا پارامتر دوم را به جای 100 ،عدد بسیار بزرگ تری برابر طول رشته خود قرار دهید:



#define strSize 25600; // characters or larger
getlinefileTest.getline(strT, strSize);

ali_mohamadi8928
سه شنبه 03 اردیبهشت 1387, 20:56 عصر
بابت پاسختون ممنون نیما جان ...