PDA

View Full Version : حذف و اصلاح اطلاعات در فایل



فردان فردان
دوشنبه 12 بهمن 1388, 09:54 صبح
من یک پروژه درسی دارم می نویسم و اطلاعات را در فایل ذخیره کرده ام


struct {char famil[20];char nam[20];char shom[10];char mtg[6];} d;




{if((fd=fopen("e:\d.txt","a+"))==NULL){printf("\ncan't open d.txt");getch();exit(1);}


fwrite(&d,sizeof(d),1,fd);

fclose(fd);






حالا می خواهم یک رکورد را حذف یا اصلاح کنم


اولا باید فایل را در چه مدی باز کنم


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

با تشکر فراوان

amin1softco
دوشنبه 12 بهمن 1388, 13:13 عصر
به نظر من بستگی به خودتون داره فایل های باینری حجم کمتری رو نسبت به نوع تکست دارند و کلا فرقی نداره ولی به نظر من برای اینکه بفهمی داری چه کار توی فایل انجام میدی از نوع تکست استفاده کن البته معایبی هم داره ...
برای حذف یک رکورد اگر بخواهی راحت باشی باید یک علامت خاص مثلا ستاره برای تشخیص, قرار بدی و وقتی در هنگام خواندن به این علامت رسیدی از روی اون رکورد بپری دیگه اینم بستگی به خودت داره که چطوری تو فایل رکورد ها رو مشخص کردی
برای اصلاح هم راحترین روش حذف رکورد فعلی و نوشتن در آخر فایله البته وقتی طول رکورد هها متغیره ولی اگه طول رکورد ها متغیر نیست و ثابته با دستور fseek برو به اول رکورد و بنویس دستوراتم یکی دوتا نیست ماشالا پر باره تو هر سر فایلی یکی پیدا میشه بستگی به خودتون داره

فردان فردان
چهارشنبه 14 بهمن 1388, 10:08 صبح
کد پیوست را ملاحظه بفرمایید
در ورود اطلاعات مشکلی ندارم
ولی در زمان ورود نمره که همان اصلاح می باشد فقط یک رکورد را میگیرد.
لطفا به من بگین که اشکال کارم در کجاست یا کد را اصلاح کنین؟
با تشکر فراوان

amin1softco
چهارشنبه 14 بهمن 1388, 10:40 صبح
دوست من شما پرشت اشتباه شما اگه طول رکورد ها رو هم ثابت بگیری مثلا با دو جهش به اندازه طول رکورد می تونی به مکان مورد نظر برسی اینجا هم چون کل رکورد رو از اول می نویسی باید بری اول هر رکورد مشکلش در پرشه در خط


مشکل داره این خط //po=ftell(fv)-sizeof(v);

فردان فردان
پنج شنبه 15 بهمن 1388, 11:29 صبح
دوست من شما پرشت اشتباه شما اگه طول رکورد ها رو هم ثابت بگیری مثلا با دو جهش به اندازه طول رکورد می تونی به مکان مورد نظر برسی اینجا هم چون کل رکورد رو از اول می نویسی باید بری اول هر رکورد مشکلش در پرشه در خط


مشکل داره این خط //po=ftell(fv)-sizeof(v);



با تشکر از دوست عزیز
ولی من از تابع ftell برای موقعیت هر رکورد استفاده کردم (پیوست) طول رکوردها را مساوی نشان می دهد یعنی پرش در لیست اطلاعات به اندازه 30 است برای همه رکوردها ثابت است.
علی ایحال برای حل مشکل چکار کنم؟
با تشکر فراوان

amin1softco
پنج شنبه 15 بهمن 1388, 15:13 عصر
شرمنده بی دقتی شده کد شم هیچ موردی نداره فقط شما به جای اینکه در هر تابع فایل رو باز کنی یک باز فایل را باز کن این کدم که اول تابع نمره اضافه کنی کار حله:


void nomre()
{FILE *fv;if((fv=fopen("v.txt","r+"))==NULL){printf("\ncan't open v.txt ");getch();exit(1);}
.
.

فردان فردان
یک شنبه 18 بهمن 1388, 10:14 صبح
شرمنده بی دقتی شده کد شم هیچ موردی نداره فقط شما به جای اینکه در هر تابع فایل رو باز کنی یک باز فایل را باز کن این کدم که اول تابع نمره اضافه کنی کار حله:


void nomre()
{FILE *fv;if((fv=fopen("v.txt","r+"))==NULL){printf("\ncan't open v.txt ");getch();exit(1);}
.
.


با عرض سلام. حالا كه لطفت شامل حال ما شده. لطفا برنامه را اصلاح و پيوست فرماييد.
من اين كار را انجام دادم هيچ فرقي نكرد و مشكل حل نشد!!!

amin1softco
یک شنبه 18 بهمن 1388, 15:21 عصر
دوست من برات کاملش کردم ولی یکم زیادی تغیرش دادم امید وارم که بدردت بخوره:


#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
struct {char shom[6];char dars[15];char vahed[3];char nomre[6];} v;
long t=0;
//===========================
long nl(FILE *fv)
{ long i=0;
fseek(fv, 0, 0);
do
{fread(&v,sizeof(v),1,fv); i++;
if (feof(fv)) break;
}while (1);
return (i-1);
}

void nomre(FILE *fv)
{
t=0;
long all=nl(fv);
char ch;
do
{
fseek(fv, t*sizeof(v), 0);
fread(&v,sizeof(v),1,fv);
if(t>=all) break;
printf("\nShom %-6s Dars: %-15s vahed: %-5s Nomre: ",v.shom,v.dars,v.vahed);
scanf("%s",v.nomre);
fseek(fv,(t++)*sizeof(v),0);
fwrite(&v,sizeof(v),1,fv);
printf("\nNomre sabt shod... press e exit");
ch=getch();
}while (ch!='e');
}
//===========================
void entv(FILE *fv){
fseek(fv, 0L, 2);
do
{
printf("\nEnter Shom = ");scanf("%s",v.shom);
printf("\nEnter Dars = ");scanf("%s",v.dars);
printf("\nEnter vahd = ");scanf("%s",v.vahed);
fwrite(&v,sizeof(v),1,fv);
printf(" Bady/Y");
if (getch()!='y') break;
}
while (1==1);
}

//=======================
void listv(FILE *fv)
{
fseek(fv, 0, 0);
clrscr();
printf("\nShom Dars Vahed Nomre ftell");
printf("\n==================================");
do
{
// printf("%d \n",ftell(fv));
fread(&v,sizeof(v),1,fv);
if (feof(fv)) break;
printf("\n%-6s %-15s %-5s %-6s %d",v.shom,v.dars,v.vahed,v.nomre,ftell(fv));
}while (1==1);
getch();
}
//=================================
void main ()
{

FILE *fv;
char* file="v.txt";
/* open the file */
if ((fv = fopen(file,"r+")) == NULL)
{
printf("Error opening file %s.\n do you want create new press ? (press y or n )\n",file);
if(getch()=='y') (fv = fopen(file,"w+")); else
exit(1);
}
while (1==1){
clrscr();
printf("\nV. Vorod");
printf("\nN. Nomre");
printf("\nL. List");
printf("\nE. Exit");
printf("\nEnter select(N/L/E)?");
switch (getch())
{case 'n':nomre(fv);break;
case 'e': exit(0);break;
case 'v': entv(fv);break;
case 'l': listv(fv);break;
}//end switch
}//end while
}
/***************************
* edit in 18/11/1388 *
* cpp.bi@yahoo.in *
****************************/