PDA

View Full Version : سوال: حذف رکورد مشخص در فایل در C++



Bvk_programmer
پنج شنبه 18 خرداد 1391, 18:43 عصر
سلام : دوستان من برنامه ای نوشتم که ورودی رو از کاربر میگیره و در فایل متنی ذخیره میکنه ، حالا میخوام بدونم اگر ما رکورد هامون زیاد بود و خواستیم بین این همه یکی را حذف کنیم از فایل باید از چه

دستوری استفاده کنیم .

با تشکر
Bvk


به عنوان مثال : ورودی ما نام ، نام خانوادگی و شماره تلفن هست ، میخواهیم با دادن شماره تلفن رکورد را ابتدا پیدا کرده و سپس ورودی های نام و نام خانوادگی و تلفن مربوط به خود را پاک کند .

ذخیره شده :

نام : علی
نام خانوادگی: رضایی
تلفن : 09191234567


حذف رکورد :
شماره تلفن را بگیرد : 09191234567
و نام : علی نام خانوادگی : رضایی را حذف کند

#target
پنج شنبه 18 خرداد 1391, 20:46 عصر
این که شما بر حسب ورودی و نا مرتب اطلاعات رو در یک فایل ثبت میکنید .
به نظر تنها راه ممکن همون جستجوی ترتیبی هست که وقتی به مقدار مورد نظر رسیدید پاک کنید

Bvk_programmer
پنج شنبه 18 خرداد 1391, 23:23 عصر
خب دوست عزیز همین پاک کردنش رو مشکل دارم به چه شکل ؟ اگه میشه توضیح بدید

r.khodabakhshi
پنج شنبه 18 خرداد 1391, 23:38 عصر
سلام.شما باید قبل از حذف حافظه ای رو که بهش اختصاص دادی آزاد کنی بعد پاکش کنی مثل کد زیر یک Structure داریم با نام Simple که یک رکورد با نام name داره وقتی که بخوام اونو کامل پاکش کنم باید اول حافظه اونو آزاد کنم بعد پاکش کنم،حالا شما باید اول بر اساس الگوریتم جستجوی که داری ساختاری که میخای حذفش کنی رو پیدا کنی و مثل کد زیر پاکش کنی:

free((void*)(Simple->name));
delete Simple->name;
delete Simple;

#target
جمعه 19 خرداد 1391, 00:02 صبح
@r.khodabakhshi > گویا گفتن در فایل . delete برای حافظه ی

شما میتونید وقتی پیداش کردین تو فایل اندیس اونجا رو (محل قرار گیریش در فایل) رو جای دیگه قرار بدین . حالا زمانی که میخواید ی رکورد اضافه کنین بجای اینکه ته فایل بنویسین بررسی کنین آیا اندیس خالی وجود داره که اول اونجا بنویسین !

(اگر شما میخواهید در یک نرم افزار واقعی استفاده کنید این روش که ترتیبی تو فایل متنی ذخیره کنید زیاد جالب نیست ! )

r.khodabakhshi
جمعه 19 خرداد 1391, 00:31 صبح
ممنون.منظورم این بود برنامشونو جوری تغییر بدن که اون رکورد کامل حذف بشه و مجددا مابقی رو داخل فایل ذخیره کنن،روشی که شما میگی اینطوریه که اگه یک رکورد اون وسط پاک شد،هم فایل و نامرتب میکنه هم بیهوده فضای زیادی اشغال میکنه،ولی اینطوری با پاک کردن یک رکورد،فایل مجددا پر میشه و کاملا مرتبه.

Bvk_programmer
جمعه 19 خرداد 1391, 01:21 صبح
اول از پاسختون بسیار متشکرم . من کد رو در اختیارتون قرار میدم تا بهتر متوجه بشید . ممنون میشم اگه درستش کنید .

# include <fstream>
# include <iostream>
# include <string.h>
using namespace std;

class Daftarche
{
private :
char name[20];
char family[40];
char phone[20];

public :
int menu();
void add ();
void view();
void find();
void About();
};

void main ()
{
Daftarche s;
int temp;
int exit=0;
while (!exit)
{
temp=s.menu();
if (temp==1)
s.add();

if (temp==2)
s.view();

if (temp==3)
s.find();

if (temp==4)
s.About();

if (temp==5)
{
cout<<"\n\n\n\n\n\n\t***************************GOOD BYE*************************";
exit=1;
}
}

}
int Daftarche::menu ()
{
int c;

cout<<"\n\t\t\t\t Menu";
cout<<"\n\t\t\t__________________________________";
cout<<"\n\n\t\t\t**********************************";
cout<<"\n\t\t\t* 1.Add *";
cout<<"\n\t\t\t**********************************";
cout<<"\n\n\n\t\t\t**********************************";
cout<<"\n\t\t\t* 2.View List *";
cout<<"\n\t\t\t**********************************";
cout<<"\n\n\n\t\t\t**********************************";
cout<<"\n\t\t\t* 3.Search *";
cout<<"\n\t\t\t**********************************";
cout<<"\n\n\n\t\t\t**********************************";
cout<<"\n\t\t\t* 4.About Me *";
cout<<"\n\t\t\t**********************************";
cout<<"\n\n\n\t\t\t**********************************";
cout<<"\n\t\t\t* 5.Exit *";
cout<<"\n\t\t\t**********************************";
cout<<"\n\t\t\t__________________________________";
cout<<"\n\n\t\t\t Yek Gozine Vared Konid (1-5) :";
cin>>c;
if((c<=5)&&(c>0))
{
return c ;
}
menu();
return 0;

}
void Daftarche::add ()
{
Daftarche set;
ofstream myfile("Address.txt", ios::app); //تمام عملیات خروجی در انتهای فایل انجام می شود. محتوای فعلی به محتوای قبلی اضافه می شود.ios::app
if(!myfile)
{
cout<<" Can Not Open File .";


}

cout<<"\n\n\t\tEnter First name : ";
cin>>set.name;
cout<<"\n\n\t\tEnter Last name : ";
cin>>set.family;
cout<<"\n\n\t\tEnter Phone Number : ";
cin>>set.phone;

myfile<< set.name<<" "<< set.family <<" "<< set.phone <<" "<<"\n" ;
myfile.close();
}
void Daftarche::view()
{
Daftarche set;

ifstream myfile("address.txt");


while (!myfile.eof())
{

myfile >>set.name>>set.family>>set.phone;
cout<< " \n\n\t\t First Name : " <<set.name<<"\n\t\t Last Name : "<<set.family
<<"\n\t\t Phone Number : "<<set.phone<<endl;

}
myfile.close();

}


void Daftarche::About ()
{
cout<<"\t\t********************************************** ****";
cout<<"\n\t\t\t Project : Phone Book";
cout<<"\n\t\t\t Name Student : Behrooz Last Name : Bvk";


cout<<"\t\t********************************************** ****";
}


void Daftarche::find ()
{
Daftarche set;
char id[20];

cout<<"\n\n\tEnter Phone Number : ";
cin>>id;
ifstream myfile("address.txt");
myfile >>set.name>>set.family>>set.phone;
if(!myfile)
{
cout<<" Can Not Open File .";

}
while(!myfile.eof()) //آیا در انتهای فایل باز شده می باشد یا خیر : eof
{

if(! strcmp(id,set.phone))
{

cout<< " \n\n\t\t First Name : " <<set.name<<"\n\t\t Last Name : "<<set.family
<<"\n\t\t Phone Number : "<<set.phone;
break;
}
myfile >>set.name>>set.family>>set.phone;
}
if(myfile.eof())
{

cout<<"\n\n\n\t\t****************** Sorry **********************\n\n";
cout<<"\t\t\t Mokhatabe Vared Shode Mojod Nemibashad";
}
myfile.close();

}

Bvk_programmer
جمعه 19 خرداد 1391, 22:01 عصر
یعنی کسی نیست به ما جواب بده ؟ ؟؟

r.khodabakhshi
شنبه 20 خرداد 1391, 08:53 صبح
سلام.اینطور که شما برنامتون رو پیاده سازی کردید باید به روشی که دوستمون target# گفتند عمل کنی،روشی که من مد نظرم بود پیاده سازی با استفاده از صف بود که بتونی یک ساختارو کامل پاک کنی.
الان کدتون مشکلش چیه؟تابع find مگه کار نمیکنه؟

Bvk_programmer
شنبه 20 خرداد 1391, 08:59 صبح
چرا کار میکنه ولی اگر من بخوام مقایسه کنم و جاش از space استفاده کنم برای پاک کردنش هنوز فضای من اشغال شده ؟ باید طوری پاک بشه که فضا آزاد بشه

#target
شنبه 20 خرداد 1391, 10:39 صبح
چرا کار میکنه ولی اگر من بخوام مقایسه کنم و جاش از space استفاده کنم برای پاک کردنش هنوز فضای من اشغال شده ؟ باید طوری پاک بشه که فضا آزاد بشه

اشکالی نداره . چون اگه قرار باشه با این وضعیت هر بار که یک چیز رو حذف میکنی کل فایلو دوباره بازسازی کنی خیلی کارایی میاد پایین !

Bvk_programmer
شنبه 20 خرداد 1391, 11:24 صبح
خب حالا برای جایگزین کردنش چه کنم

r.khodabakhshi
شنبه 20 خرداد 1391, 12:17 عصر
سلام،دوست عزیز این تالار قوانین خودشو داره من نمی تونم کد کاملشو در اختیارت قرار بدم واسه اینکار اولا خودت که برنامه نویس ماهری هستی دوما باید بری قسمت درخواست پروژه.

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

روش دوم که خیلی نسبت به روش صف بهتره،پیاده سازی با لیست پیوندیه.هم راحتتره هم قضیه پاک کردنش آسون تره.

واسه لیست پیوندی هم بهترین مرجع یادگیری یا یادآوری سایت:

www.cplusplus.com و همچنین دوست عزیزمون google

موفق باشی.

#target
شنبه 20 خرداد 1391, 13:09 عصر
برا اینکه سریع کارت راه بیوفته فعلا ی کاری کن ی متغیر به نامISValid به کلاست اضافه کن . و اونو یک بده هر وقت میخوای پاک کنی همینو صفر کن تو فایل . وقت جستجو و اینا هم وقتی این متغیر صفر در نظر نگیرش !
private :
char name[20];
char family[40];
char phone[20];
int IsValid;
set.IsValid = 1
myfile<< Set.IsValid<< set.name<<" "<< set.family <<" "<< set.phone <<" "<<"\n" ;

if(! strcmp(id,set.phone) && (set.IsValid))

Bvk_programmer
شنبه 20 خرداد 1391, 14:07 عصر
سلام،دوست عزیز این تالار قوانین خودشو داره من نمی تونم کد کاملشو در اختیارت قرار بدم واسه اینکار اولا خودت که برنامه نویس ماهری هستی دوما باید بری قسمت درخواست پروژه.

سلام : ضمن تشکر بابت راهنمایی، باید عرض کنم دوست عزیز من برنامه رو کامل نوشتم فقط قسمتی از کد رو راهنمایی خواستم نه کل سورس رو .

روش دوم که خیلی نسبت به روش صف بهتره،پیاده سازی با لیست پیوندیه.هم راحتتره هم قضیه پاک کردنش آسون تره.




واسه لیست پیوندی هم بهترین مرجع یادگیری یا یادآوری سایت:

www.cplusplus.com و همچنین دوست عزیزمون google

موفق باشی.

متاسفانه لیست پیوندی در ساختمان داده ارائه میشود و من آشنایی باهاش ندارم .

sajjad625
جمعه 11 بهمن 1392, 19:47 عصر
سلام دوستان عزیز من یه برنامه به زبان ++c دارم میخواستم قسمت حذف رو بهش اضافه کنم کسی میتونه کمک کنه کدش رو برام اضافه کنه خیلی ضروری است برای فردا میخوامش
#include "iostream.h"
#include "conio.h"
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "fcntl.h"

#define max 50

class student {
public :
char numst[11];
char name[15];
char famili[20];
double score[4];
double ave;
student(); //initializing
~student(); //destructing
set_null(){name[0]=numst[0]='\0';}
}st[max];
//************************************
student::student(){ //initializing
set_null();
}
//*************************************
student::~student(){ //destructing
set_null();
}
//*************************************
class Enter {
private :
void save();
public :
void add();
void edit();
void search();
void print();
void len_file();
void load();
}e;
//************************************************** ****************************
void Enter::add(){
int i;
double sum=0.00;

for(i=0;i<max && st[i].name[0]!='\0';i++);

clrscr();
cout<<"\n Enter a name : ";
cin>>st[i].name;

cout<<"\n Enter a famili : ";
cin>>st[i].famili;

cout<<"\n Enter a numst : ";
cin>>st[i].numst;


for(int j=0;j<4;j++){
cout<<"\n Enter a score "<<j+1<<" : ";
cin>>st[i].score[j];
sum+=st[i].score[j];
}

st[i].ave=sum/4;

e.save();
}
//************************************************** ****************************
void Enter::edit(){
char tmp[11];
int i,flag=0;;
double sum=0.00;

clrscr();

cout<<"\n Enter a numst for edit : ";
cin>>tmp;

for(i=0;i<max && st[i].name[0]!='\0';i++)
if(strcmp(st[i].numst,tmp)==0){
cout<<"\n Enter a new name : ";
cin>>st[i].name;

cout<<"\n Enter a new famili : ";
cin>>st[i].famili;


for(int j=0;j<4;j++){
cout<<"\n Enter a new score "<<j+1<<" : ";
cin>>st[i].score[j];
sum+=st[i].score[j];
}

st[i].ave=sum/4;

cout<<"\n for continue . press key...";
getch();
flag=1;
e.save();
}

if(flag==0){
cout<<"\n Not found . press key...";
getch();
return ;
}
}
//************************************************** ****************************
void Enter::search(){
char tmp[15];
int i,flag=0;


clrscr();

cout<<"\n Enter a name for search : ";
cin>>tmp;

for(i=0;i<max && st[i].name[0]!='\0';i++)
if(strcmp(st[i].name,tmp)==0){
cout<<"\n Name = "<<st[i].name;

cout<<"\n Famili = "<<st[i].famili;


for(int j=0;j<4;j++)
cout<<"\n Score "<<j+1<<" = "<<st[i].score[j];

cout<<"\n average = "<<st[i].ave;

cout<<"\n for continue . press key...";
getch();
flag=1;
}

if(flag==0){
cout<<"\n Not found . press key...";
getch();
return ;
}
}
//************************************************** ****************************
void Enter::print(){
int i;

clrscr();

for(i=0;i<max && st[i].name[0]!='\0';i++){

cout<<"\n Name = "<<st[i].name;

cout<<"\n Famili = "<<st[i].famili;

for(int j=0;j<4;j++)
cout<<"\n Score "<<j+1<<" = "<<st[i].score[j];

cout<<"\n average = "<<st[i].ave<<"\n\n";
}

cout<<"\n for continue . press key...";
getch();

}
//************************************************** ****************************
void Enter::save(void){
register int i;
FILE *fp;

fp=fopen("c:\\st.dat","w+b");
if(!fp){
cout<<"\n Cannot open file press key ...";
getch();
return ;
}

for(i=0;i<max && st[i].name[0]!='\0';i++)
fwrite(&st[i],sizeof(class student),1,fp);

fclose(fp);
}
//************************************************** ****************************
void Enter::load(void){
register int i;
FILE *fp;

clrscr();

fp=fopen("c:\\st.dat","rb");
if(!fp){
cout<<"\n Cannot open file press key ...";
getch();
return ;
}

for(i=0;i<max;i++){
fread(&st[i],sizeof(class student),1,fp);
if(feof(fp)){
clrscr();
cout<<" Data loaded press a key ...";
getch();
return ;
}
}
fclose(fp);
}
//************************************************** ****************************
void Enter::len_file(){
int handle;

clrscr();

handle=open("c:\\st.dat",O_RDONLY);

cout<<"\n File lenght in byte = "<<filelength(handle)<<" byte ";
getch();

close(handle);

}
//************************************************** ****************
void main(){
int num;

e.load();

do{
clrscr();
cout<<"\t\t Welcome\n";
cout<<"\n 1).Add";
cout<<"\n 2).Edit";
cout<<"\n 3).Search";
cout<<"\n 4).List";
cout<<"\n 5).Length file";
cout<<"\n 6).Exit";
cout<<"\n\n Enter a number (1-6) :";
num=getche()-48;
getch();

switch (num){
case 1 : e.add();
break;
case 2 : e.edit();
break;
case 3 : e.search();
break;
case 4 : e.print();
break;
case 5 : e.len_file();
break;
case 6 : exit(1);
}
}while(1);
}// end program

moein.n
سه شنبه 02 دی 1399, 09:47 صبح
سلام . من میخام که خالی بودن یک فایل رو چک کنم چطوریه از این دستور هم استفاده کردم جواب نداد
(if(myfile.open("filename")=NULL
cerr<<"file is empty";