• پایان فعالیت بخشهای انجمن: امکان ایجاد موضوع یا نوشته جدید برای عموم کاربران غیرفعال شده است

ذخیره عناصر آرایه برای همیشه -- خواندن و نوشتن در فايل

sima_c

کاربر تازه وارد
تاریخ عضویت
21 می 2006
نوشته‌ها
30
لایک‌ها
0
با سلام
سوالی داشتم در مورد ذخیره عناصر آرایه :
عناصر داخل آرایه در اجرای بعد برنامه از بین میره ، چکار کنم از بین نره؟
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
سلام خوب هستید
با هر بار اجرای برنامه بعلت بار گذاری مجدد برنامه در حافظه استیک جدیدی ساخته میشه یعنی اطلاعات قبلی از بین میره برای حل این مشکل شما میتنید قبل از خروج از برنامه اطلاعات مورد نظر را در فایلی ذخیره کرده و در ایتدار برنامه در صورت وجود اطلاعات در این فایل این اطلاعات را در اریه مورد نظر جا گذاری کند

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

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

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
در ويندوز برنامه مقيم(و تمامي نخ هاش) معني نميده ،
تا جايي که منم ميدونم تکنيکي که آقا سعيد ارائه کردن چاره اين کار هست
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
با سلام.

منظور ايشان هم فكر كنم ذخيره در فايل است.
من در حال مطالعه در اين موردم ولي خيلي مشكل دارم.
اگر دوستان برنامه آماده اي براي ذخيره يك آرايه دارند بگذارند. يا ذخيره يك ارايه از اعضاي يك استراكت.
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
براي ذخيره ارايه : (البته در مورد الگوريتم : sequential و سرعت کم)
کد:
#include <stdio.h>
#include <conio.h>

int main() {
	int arr[3] = {4,5,6};
	FILE *fp ;

   fp = fopen("C:\\a.txt","rt");
   if(fp)
   {
      printf("Read\n");
      for(int i=0;i<3&& arr[i] != EOF;i++)
      {
      	arr[i] = fgetc(fp);
      }
   }
   else
   {
	   fp = fopen("c:\\a.txt","wt");
   	printf("Save\n");
   	for(int i=0;i<3;i++)
      {
      	fputc(arr[i],fp);
      }
   }
   for(int i =0;i<3;i++) {
   	printf("%3d",arr[i]);
   }
   getch();
}
بعد اجراي اولين بار ، مقدار اوليه آرايه رو هم که عوض کنيم در نهايت(تغيير مقدار) بينتيجه ميشه (فايل در حافظه جانبي مقيم هست و در ظي برنامه عناصر آرايه تغيير ميکنه)
 
  • Like
Reactions: 4bm

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
ممنون آقا مهدي.
خيلي برنامه خوش دستي است.
خطا نمي دهد چون اگر فايل نباشد مي سازدش و اگر باشه مي خواندش.
------------------------------------------------
راستي من كتاب جناب جعفرنژاد را نگاه كردم و كتاب هربرت شيلد را.
هر دو براي ذخيره يك استراكت در فايل از يك برنامه واحد استفاده كرده اند انگار.

آيا آقاي جعفرنژاد همان كتاب را ترجمه كرده.؟
--------------------------------------------------------
اين كتاب 2 مگاست و در تاپيك كتابها هست.
مثال كاملي از ذخيره استراكت زده. ولي طولاني بود و راستش چيزي ازش نفهميدم نگذاشتم.
اگر لازم شد بگيد نقل كنم.
.
 

sima_c

کاربر تازه وارد
تاریخ عضویت
21 می 2006
نوشته‌ها
30
لایک‌ها
0
ممنون دوستان .
اما میشه کمی در مورد فایلها توضیح بدین ؟
 

sima_c

کاربر تازه وارد
تاریخ عضویت
21 می 2006
نوشته‌ها
30
لایک‌ها
0
همانطور که در نمونه بالا گفته شد من استفاده کردم اما به یک مشکل بر خوردم که چگونه می تونم اعضای یک ساختمان struct رو ذخیره و فراخوانی کنم
کد:
fp = fopen("C:\\prog.dat","rt");
	if(fp)
	{
		while (ex[i++].kala[i++]!= EOF)
		{
			// inja ro chy benvisam
			ex[i].vazn= fgetc(fp);
			//
			i++;
		}
	}
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
براي ذخيره:

کد:
#include <iostream.h>
#include <fstream.h>  // for file_stream
#include <stdlib.h>  // for exit(1)

void main()
{
int a[4]={2,43,54,4};
char *b[4]={"abc","efg","ert","ghi"};


 ofstream myfile( "C:\\a.txt", ios::out );
 if ( !myfile )
	 {
	 cerr << "File could not be opened" << endl;
	 exit( 1 );
	 }


 for (int counter=0 ; counter<4 ; counter++ )
	myfile << a[counter] << ' ' << b[counter]  << endl;


}
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
براي خواندن:

کد:
#include <iostream.h>
#include <fstream.h>  // for file_stream
#include <stdlib.h>  // for exit(1)

void main()
{
int a[4]={11,11,11,11};
char *b[4]={"ddd","ddd","ddd","ddd"};


 ifstream myfile( "c:\\a.txt", ios::in );
 if ( !myfile )
	 {
	 cerr << "File could not be opened" << endl;
	 exit( 1 );
	 }

	  // khaandan az file
for (int counter=0 ; counter<4 ; counter++ )
myfile >>a[counter] >> b[counter];

		  // chaap dar safheh
for (int counter2=0 ; counter2<4 ; counter2++ )
 cout<<a[counter2]<<"   "<<b[counter2]<<endl;

}
 

CDEB

کاربر تازه وارد
تاریخ عضویت
5 ژوئن 2006
نوشته‌ها
21
لایک‌ها
0
salam man ye moshkele koochik too C++ daram lotfan komak kon.projeye daneshgahie va bayad ta farda tahvil bedam: ye barnamas ke matn ro az file text migire va ramznegari mikone va too ye file matne dige save mikone.man nemidoonam chejoori az windows file begiram va file too ye directory khas dorst konam.agha khaheshan zodtar komakam konid.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
با سلام و خوش آمد.
بيشتر توضيح بدهيد.

در بالا دو برنامه هست كه يكي فايل تكستي را مي خواند و ديگري در فايل تكستي مي نويسد.
رمز سازي هم با فرمولهاي ساختگي به راحتي امكان پذير است كه دوستان از من واردترند.
منتظر پاسخ شما و كمك دوستان هستيم.
.
هر فايلي كه آدرسش را بدهيد مي شود باز كرد. ولي معمولا براي كار با فايلي كه نمي دونيم چه چيزي و با چه تايپي درش ذخيره شده ، به راحتي نميشه كار كرد. نمي دونم چقدر كدنويسي مي خواهد ولي شايد زياد طول بكشه.

توابعي هم براي سرچ فايل و اين جور كارها هست.
.
 

CDEB

کاربر تازه وارد
تاریخ عضویت
5 ژوئن 2006
نوشته‌ها
21
لایک‌ها
0
متشكرم.
برنامه اي كه بايد بنويسم تقريبا كامله فقط براي گرفتن متن جهت رمز نگاري اون رو به صورت رشته از keyboard ميگيره و بعد از رمزنگاري فقط رو monitor نشون ميده.ولي من بايد كاري كنم كه به جاي گرفتن متن به صورت رشته فايل تكستي كه مثلا در شاخه c:\text.txt قرار داره رو بگيره و بهد از رمزنگاري(اينجاشو بلدم و نوشتم!) به جاي cout اونو تو يه فايل مثلا c:\textramzdar.txt ذخيره كنه.اگه ممكنه نظرتونو ميخوام بدونم.قبلا تشكر ميكنم....
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
برنامه زير ، دو فايل باز مي كند ، از فايل مبدا كلمات را مي خواند و در فايل مقصد مي نويسد.
جايي كه نقطه چين گذاشته شده،، كلمه در دسترس ماست و مي توانيم آن را به رمز درآوريم.
من 150 كلمه را خواندم. البته بايد به اندازه حجم فايل بخوانيم كه نتوانستم راهي فعلا پيدا كنم.

يك فايل تكست بسازيد و در آن متني شامل چند جمله بنويسيد. و با نام text.txt ذخيره كنيد. و بعد برنامه را اجرا كنيد.

کد:
#include <iostream.h>
#include <fstream.h>  // for file_stream
#include <stdlib.h>  // for exit(1)

void main()
{

char *kalameh=" ";

 ifstream myfile1( "c:\\text.txt", ios::in );
 ofstream myfile2( "c:\\text2.txt", ios::out );

 if ( !myfile1 || !myfile2)
	 {
	 cerr << "File 1 or 2  could not be opened" << endl;
	 exit( 1 );
	 }

for(int counter=0 ; counter<150  ;counter++ )
	 {
 myfile1 >>kalameh ;         // khandan az file 1
  // .............
  // .............
  // .............
 cout<<"kalameh= "<<kalameh<<endl;
  // .............
  // .............
  // .............

 myfile2 << kalameh << endl;    // neveshtan dar file 2
	 }
}
 

CDEB

کاربر تازه وارد
تاریخ عضویت
5 ژوئن 2006
نوشته‌ها
21
لایک‌ها
0
ممنونم مشكلمو حل كردي.
خيلي عالي بود همينو ميخواستم.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
همان برنامه بالا را كمي اصلاح كردم. حلقه for را برداشتم و بجاش حلقه while گذاشتم.
اين برنامه وقتي مي بينه كه kalameh خالي است ديگه ادامه نمي دهد.
و براي اينكار از تابع مقايسه دو رشته ، يعني strcmp استفاده مي كند.
اين تابع وقتي دو رشته برابر باشند ، مقدار صفر برمي گرداند كه باعث ميشه حلقه while باطل اعلام بشه و متوقف بشه.
البته اين برنامه را من درآوردي نوشتم. روشهاي درست كتابي چيز ديگه است شايد.
تابع strcmp در همه كامپايلرها فكر كنم در صورت تساوي صفر باشه خروجي اش ولي در صورت بزرگتر بودن اولي يا دومي نمي دونم در كامپايلرهاي مختلف چطوري عمل مي كنه. در كتاب گفته منفي يك و مثبت يك ولي من چك نكردم چون اينجا فقط تساوي برايم مهم بود.
عدد 97 هم اختياري است. هيچ فلسفه اي ندارد. ولي اگر صفر بدهيد ، حلقه while استارت نميشه.
.
کد:
#include <iostream.h>
#include <fstream.h>  // for file_stream
#include <stdlib.h>  // for exit(1)
[color=red]#include <string.h>[/color]

void main()
{

char *kalameh=" ";
[color=red]int barasi=97;[/color] 

 ifstream myfile1( "c:\\text.txt", ios::in );
 ofstream myfile2( "c:\\text2.txt", ios::out );

 if ( !myfile1 || !myfile2)
	 {
	 cerr << "File 1 or 2  could not be opened" << endl;
	 exit( 1 );
	 }

 while ([color=red]barasi[/color])
	 {
 myfile1 >>kalameh ;         // khandan az file 1
 [color=red]barasi=strcmp(kalameh ,"") ;[/color]
  // .............
  // .............
  // .............
 cout<<"kalameh= "<<kalameh<<endl;
  // .............
  // .............
  // .............

 myfile2 << kalameh << endl;    // neveshtan dar file 2
	 }
}
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
حالا wordpad را باز كنيد و يك چيزايي بنويسيد و با پسوند rtf و با نام myrtf در درايو سي ذخيره كنيد و برنامه زير را اجرا كنيد.

کد:
#include <iostream.h>
#include <fstream.h>  // for file_stream
#include <stdlib.h>  // for exit(1)
#include <string.h>

void main()
{

char *kalameh=" ";
int barasi=97;

 ifstream myfile1( "c:\\[color=red]myrtf.rtf[/color]", ios::in );
 ofstream myfile2( "c:\\text2.txt", ios::out );

 if ( !myfile1 || !myfile2)
	 {
	 cerr << "File 1 or 2  could not be opened" << endl;
	 exit( 1 );
	 }

 while (barasi)
	 {
 myfile1 >>kalameh ;         // khandan az file 1
 barasi=strcmp(kalameh ,"") ;
  // .............
  // .............
  // .............
 cout<<"kalameh= "<<kalameh<<endl;
  // .............
  // .............
  // .............

 myfile2 << kalameh << endl;    // neveshtan dar file 2
	 }
}

فايل در wordpad و نتيجه اجرا در توربو سي را در زير آورده ام.


d1.gif


d2.gif


.
حالا چيزي كه من دنبالشم ، ساخت يك اديتوره كه در wordpad با رنگها و اندازه ها و فونتهاي مختلف بنويسيم و بعد با اين برنامه تبديل به تگ color و size و font كنيم براي پست زدن در فروم ها. همچنين وسط چين و راست چين و چپ چين.

نوع
doc

را مشكل داشتم.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
در اين برنامه به جاي :

کد:
char * c……;

از :

کد:
char c….;

استفاده شده. باز هم از خودم نوشتم. نمي گم روش درستيه.
كاربرهايي شايد داشته باشه. برنامه هاي قبلي رشته اي از كاراكترها را مي گرفت ولي اين برنامه، كاراكتر – كاراكتر دريافت مي كنه. فقط يك عيبي داره و آن اينه كه فواصل ( space ) را گزارش نمي كنه. فكر كنم با تابع هاي ديگري بشه اين space ها را دريافت كرد. شايدم با نوع int گرفتن و ...


کد:
#include <iostream.h>
#include <fstream.h>  // for file_stream
#include <stdlib.h>  // for exit(1)

void main()
{
[color=red]char  c[/color]='k';
 ifstream myfile1( "c:\\text.txt", ios::in );
 ofstream myfile2( "c:\\text2.txt", ios::out );

 if ( !myfile1 || !myfile2)
	 {
	 cerr << "File 1 or 2  could not be opened" << endl;
	 exit( 1 );
	 }
 while ( [color=red]  c != '\0'[/color]   )
	 {
	[color=red] c='\0';[/color]
 myfile1 >>c ;         // khandan az file 1
	// .............
  // .............
  // .............
 cout<<" c= " <<c<<"    (int)c= "<<(int)c<<endl;
  // .............
  // .............
  // .............

 myfile2 << c << endl;    // neveshtan dar file 2
	 }

}


من داخل كاراكتر صفر ريختم كه اگر از فايل چيزي درونش پر نشد ، باعث توقف حلقه بشه ولي اگر از فايل چيزي درونش بريزه ، آنوقت ديگه صفر نيست و خواندن فايل ادامه مي يابد. شما هر كاراكتر ديگري را مي توانيد به جاي آن بگذاريد. ولي ديگه اگر توي فايل بهش برخورد بشه باعث توقف ميشه.
.
 

sima_c

کاربر تازه وارد
تاریخ عضویت
21 می 2006
نوشته‌ها
30
لایک‌ها
0
این برنامه ایست که نوشتم
اما یک مشکل داره اینه که
داده ها وقتی در فایل ذخیره میشن . باید بعد از داده های قبلی ذخیره بشن . اما اینطور نیست چکار باید بکنم ؟(نیاز فوری)
کد:
#include <stdio.h>
#include <cstring.h>
#include <conio.h>
#include <iostream.h>
#define  size 100

struct kala{
char name[50];
int vazn,gh;
} ex [size] ;

void jadid (int z);
void jostejo(char name[20]);
void load ();
main()
{
char price,na[20];
int i,j,z=0;
FILE *f;
load();
vorodi:
clrscr();
cout <<"New Recorde [1] :::"<<" [ search [2] ]"<<endl;
cin >> j;
switch (j){
case 1 :
z++;
jadid(z);
goto vorodi;
case 2 :
clrscr();
cout <<"name of material :  ";
cin >> na;
jostejo(na);
default:
goto vorodi;
}
return(0);
}

void jadid (int z){
register int i=0;
char ch,num[20];
FILE *f;
f=fopen("kala.dat","wt");
clrscr();
while (1)
{
cout <<"material: " ;
cin >> ex[i].name;
cout <<"w: " ;
cin >> num ;
ex[i].vazn=atoi(num);
cout <<"price : " ;
cin >> num;
ex[i].gh=atoi(num);
if(*ex[i].name)
fwrite(&ex[i],sizeof(struct kala),1,f);
i++;
if ((ch=getche())== '+')
break;
}
}

void jostejo(char name[20]){
char ch;
register int i=0;
register int y=0;
load();
clrscr();
while(i<size)
{
if (strcmp(ex[i].name,name)==0)
{
cout<<ex[i].vazn<<"   "<<ex[i].gh ;
y=1;
break;
}
else
y=0;
i++;
}
if (y==0)
cout << "can not find material " ;
getch();
}


void load (){
FILE *f;
register int i;
f=fopen("kala.dat","rt");
if(f==NULL)
{
cout <<"\n cannot open file";
cout <<"\n press a key... ";
getch ();
return ;
}
else
{
while (feof(f))
fread(&ex[i],sizeof(struct kala),1,f);
}
}
 
بالا