PDA

View Full Version : سوال: نوشته شدن اطلاعات جدید بر روی اطلاعات قبلب در فایل



veniz2008
چهارشنبه 10 خرداد 1391, 17:01 عصر
سلام دوستان،من مشخصات تعدای دانشجو رو درون فایل ذخیره میکنم( از توربو سی پلاس پلاس استفاده میکنم)،حالا مشکلم اینه زمانی که دوباره میخوام درون فایل بنویسم اطلاعات جدید روی اطلاعات قبلی نوشته میشن(در واقع اطلاعات قبلی حذف میشن)، درصورتیکه من میخوام که اطلاعات جدید در ادامه اطلاعات قبلی اضافه بشهفمن از کد زیر برای ذخیره مشخصات استفاده میکنم،چه کدی باید اضافه کنم تا رکوردهای جدید در سطر بعدی آخرین رکورد فایل نوشته بشن؟

#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
//
struct student {
char name[20];
char family[30];
int stdno;};
void main()
{
FILE *fp;
int n=0;
student st;
fp = fopen("d:\\test.txt", "wt");
cout<<"\nINPUT NUMBER OF STUDENT:";
cin>>n;
for(int i=1;i<=n;i++){
cout<<"NAME:";
cin>>st.name;
cout<<"FAMILY:";
cin>>st.family;
cout<<"STDNO:";
cin>>st.stdno;
fputs(st.name,fp);
fputs(st.family,fp);
fprintf(fp,"%d\n",st.stdno);
cout<<"---------\n";
}
//
fclose(fp);
}

mehdi.mousavi
چهارشنبه 10 خرداد 1391, 17:12 عصر
سلام.
جای wt flag می تونید از a+ استفاده کنید.
لیست flag های موجود رو در اینجا مشاهده کنید (http://www.cplusplus.com/reference/clibrary/cstdio/fopen/).

موفق باشید.

veniz2008
چهارشنبه 10 خرداد 1391, 17:31 عصر
سلام.
جای wt flag می تونید از a+ استفاده کنید.
لیست flag های موجود رو در اینجا مشاهده کنید (http://www.cplusplus.com/reference/clibrary/cstdio/fopen/).

موفق باشید.
من به جای wt از a+ استفاده کردم ولی خطا میده( یه تابلو سیاه رنگ sTOP میاد)،دوستان لطفا راهنمایی کنید

mehdi.mousavi
چهارشنبه 10 خرداد 1391, 18:12 عصر
من به جای wt از a+ استفاده کردم ولی خطا میده( یه تابلو سیاه رنگ sTOP میاد)،دوستان لطفا راهنمایی کنید

من الان آزمایش کردم (در VS2010) و کد پس از تغییر wt به a+ بدون هیچ مشکلی کار کرد.
تابلو سیاه رنگ STOP چیه؟ میشه فنی صحبت کنید؟ اگر Error ای گرفته اید، لطفا متن Error رو اینجا بذارید.

AbbasVB
چهارشنبه 10 خرداد 1391, 18:16 عصر
دوست عزیز اینو امتحان کن البته شاید مشکل داشته باشه چون c++ نداشتم تست نکردم اما شکل کلیش همینه


#include <iostream.h>
#include <fstream.h>

struct student {
char name[20];
char family[30];
int stdno;};
void main()
{
fstream fp;
int n=0;
student st;
fp = open("d:\test.txt",ios::app);
cout<<"\nINPUT NUMBER OF STUDENT:";
cin>>n;
for(int i=1;i<=n;i++){
cout<<"NAME:";
cin>>st.name;
cout<<"FAMILY:";
cin>>st.family;
cout<<"STDNO:";
cin>>st.stdno;
fp.write((char *)& st,sizeof(st));
cout<<"---------\n";
}
}

mehdi.mousavi
چهارشنبه 10 خرداد 1391, 18:27 عصر
دوست عزیز اینو امتحان کن البته شاید مشکل داشته باشه چون c++ نداشتم تست نکردم اما شکل کلیش همینه

کدتون ایراد داره، صحیحش اینه:

fstream fp;
int n=0;
student st = {NULL};
fp.open("d:\\test.txt",ios::app);
cout<<"\nINPUT NUMBER OF STUDENT:";
cin>>n;
for(int i=1;i<=n;i++){
cout<<"NAME:";
cin>>st.name;
cout<<"FAMILY:";
cin>>st.family;
cout<<"STDNO:";
cin>>st.stdno;
fp.write((const char*)&st, sizeof(st));
cout<<"---------\n";
}

fp.close();

اما این کد، فایلی از نوع Binary میسازه، اما صورت سوال فایلی از نوع text بوده!

موفق باشید.

AbbasVB
چهارشنبه 10 خرداد 1391, 18:33 عصر
کدتون ایراد داره، صحیحش اینه:

fstream fp;
int n=0;
student st = {NULL};
fp.open("d:\\test.txt",ios::app);
cout<<"\nINPUT NUMBER OF STUDENT:";
cin>>n;
for(int i=1;i<=n;i++){
cout<<"NAME:";
cin>>st.name;
cout<<"FAMILY:";
cin>>st.family;
cout<<"STDNO:";
cin>>st.stdno;
fp.write((const char*)&st, sizeof(st));
cout<<"---------\n";
}

fp.close();

اما این کد، فایلی از نوع Binary میسازه، اما صورت سوال فایلی از نوع text بوده!

موفق باشید.
برای text بودن فکر کنم باید این کدو به به کد زیرش تبدیل کنن.
fp.open("d:\\test.txt",ios::app);



fp.open("d:\\test.txt",ios::app|ios::text);

واینکه حالت پیش فرض ios هم فکرکنم Text باشه

AbbasVB
چهارشنبه 10 خرداد 1391, 18:34 عصر
اینم توی کاسه کوزم داشتم دوستان
شاید به کارتون بیاد


// Student Information System
// Created By: Mr. Jake Rodriguez Pomperada, MAED-Instructional Technology
// Purok Pag-asa, Barangay Alijis Bacolod City, Negros Occidental Philippines
// Tel. No. (034) 433 5081
// Date : March 11, 2010 8:42 PM Thursday
// Language : C++‎



#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <iomanip.h>


main() {
FILE *fp, *ft;
char another, choice;

struct student {
char first_name[50], last_name[50];
char course[100];
int section;
};

struct student e;
char xfirst_name[50], xlast_name[50];
long int recsize;

fp=fopen("users.txt","rb+");

if (fp == NULL) {
fp = fopen("users.txt","wb+");

if (fp==NULL)
{
puts("Cannot open file");
return 0;
}
}


recsize = sizeof(e);

while(1) {
system("cls");

cout << "\t\t====== STUDENT INFORMATION SYSTEM ======";
cout <<"\n\n Created By: Mr. Jake Rodriguez Pomperada, MAED-IT";
cout << "\n\n";
cout << "\n \t\t\t 1. Add Records";
cout << "\n \t\t\t 2. List Records";
cout << "\n \t\t\t 3. Modify Records";
cout << "\n \t\t\t 4. Delete Records";
cout << "\n \t\t\t 5. Exit Program";
cout << "\n\n";
cout << "\t\t\t Select Your Choice :=> ";
fflush(stdin);
choice = getche();
switch(choice)
{
case '1' :
fseek(fp,0,SEEK_END);
another ='Y';
while(another == 'Y' || another == 'y')
{
system("cls");
cout << "Enter the Firt Name : ";
cin >> e.first_name;
cout << "Enter the Last Name : ";
cin >> e.last_name;
cout << "Enter the Course : ";
cin >> e.course;
cout << "Enter the Section : ";
cin >> e.section;
fwrite(&e,recsize,1,fp);
cout << "\n Add Another Record (Y/N) ";
fflush(stdin);
another = getchar();
}
break;
case '2':
system("cls");
rewind(fp);
cout << "=== View the Records in the Database ===";
cout << "\n";
while (fread(&e,recsize,1,fp) == 1){
cout << "\n";
cout <<"\n" << e.first_name << setw(10) << e.last_name;
cout << "\n";
cout <<"\n" <<e.course << setw(8) << e.section;
}
cout << "\n\n";
system("pause");
break;

case '3' :
system("cls");
another = 'Y';
while (another == 'Y'|| another == 'y')
{
cout << "\n Enter the last name of the student : ";
cin >> xlast_name;

rewind(fp);
while (fread(&e,recsize,1,fp) == 1)
{
if (strcmp(e.last_name,xlast_name) == 0)
{
cout << "Enter new the Firt Name : ";
cin >> e.first_name;
cout << "Enter new the Last Name : ";
cin >> e.last_name;
cout << "Enter new the Course : ";
cin >> e.course;
cout << "Enter new the Section : ";
cin >> e.section;
fseek(fp, - recsize, SEEK_CUR);
fwrite(&e,recsize,1,fp);
break;
}
}
cout << "\n Modify Another Record (Y/N) ";
fflush(stdin);
another = getchar();
}
break;


case '4':
system("cls");
another = 'Y';
while (another == 'Y'|| another == 'y')
{
cout << "\n Enter the last name of the student to delete : ";
cin >> xlast_name;

ft = fopen("temp.dat", "wb");

rewind(fp);
while (fread (&e, recsize,1,fp) == 1)

if (strcmp(e.last_name,xlast_name) != 0)
{
fwrite(&e,recsize,1,ft);
}
fclose(fp);
fclose(ft);
remove("users.txt");
rename("temp.dat","users.txt");

fp=fopen("users.txt","rb+");

cout << "\n Delete Another Record (Y/N) ";
fflush(stdin);
another = getchar();
}

break;

case '5':
fclose(fp);
cout << "\n\n";
cout << "\t\t THANK YOU FOR USING THIS SOFTWARE";
cout << "\n\n";
exit(0);
}
}


system("pause");
}

mehdi.mousavi
چهارشنبه 10 خرداد 1391, 19:17 عصر
برای text بودن فکر کنم باید این کدو به به کد زیرش تبدیل کنن.
fp.open("d:\\test.txt",ios::app);



fp.open("d:\\test.txt",ios::app|ios::text);

واینکه حالت پیش فرض ios هم فکرکنم Text باشه

مجددا سلام.
در VS2010، من ios::text نمی بینم (نمیدونم این استانداره یا نه، فقط حدس زده اید). در هر حال، همونطوریکه عنوان کردید، فایل بصورت پیش فرض، text هستش. اما وقتی structure رو به اون شکل به یکباره در فایل میریزید، اطلاعات لاجرم بصورت Binary در فایل ریخته میشه. بنابراین باید از << operator برای نوشتن اجزای struct در فایل بصورت جداگانه استفاده کنیم (یا به هر نحوی اون struct رو به رشته مورد نظری که قراره در فایل text بنویسیم تبدیل کنیم) سپس اونو در فایل بنویسیم. بطور مثال میتونیم به این شکل عمل کنیم:

fp << st.name;
fp << st.family;
fp << st.stdno;

موفق باشید.