PDA

View Full Version : سوال: فایل باینری



jasmin.d
دوشنبه 05 فروردین 1392, 14:45 عصر
سلام خسته نباشید-سال نو مبارک باشه....
کسی میتونه به من کمک کنه؟این برنامه اطلاعت یک دانشجو رو از ورودی خوانده ودر فایل میریزه وقسمت بعدی شماره رکورد مورد نظر رو گرفته و مشخصات آن رکورد را چاپ میکند میتونید کد قسمتی که بخوام کل رکورد موجود در فایل رو بخونه چاپ کنه و یه قسمت دیگه برای این که لیست رکوردها رو معکوس کنه از اول به آخر بدون اسفاده از آرایه ای از رکوردها رو بهم بگید؟ممنون

#include "stdafx.h"
#include <stdio.h>
using namespace std;
#include <iostream>
#include "stdlib.h"

struct student
{
char name[20];
char stdNum[12];
};
void menu();

void clear( char a[] )
{

for( int i = 0 ; i < sizeof(a) ; i++ )
{
a[i] = '\0';
}
}

void setRecord()
{
FILE *fp;

fp = fopen( "records.txt" , "ab" );
if( fp == NULL)
{
cout << " Error! " << endl;
cin.get();
cin.get();
exit(0);
}

student test;
clear(test.name);
clear(test.stdNum);

cout << "Please Enter Student Name: ";
cin >> test.name;
cout << endl ;

cout << "Please Enter Student Number: ";
cin >> test.stdNum;

fwrite( &test , sizeof(test) , 1 , fp );

fclose(fp);

cout << "done!" << endl;

menu();
}

void showRecords()
{
FILE *fp;
fp = fopen("records.txt" , "rb");
if( fp == NULL )
{
cout << "Error On File!" << endl;
cin.get();
cin.get();
exit(0);
}

student test;

int i = 1;

while(fread( &test , sizeof(test) , 1 , fp ))// dar in barname zakhire kole rekord hastesh.va b in form zakhire taktak fildaha:(fwirte(&test , sizeof(test.name) , 1 , fp ))
{
printf("%d-%s\t%s\n" , i , test.name , test.stdNum );
i++;
fread( &test , sizeof( test ) , 1 , fp);
}

fclose(fp);

menu();
}

void showRecordByNum()
{
cout << "Enter Number Of Record:";
int recordNum = 0 ;
cin >> recordNum;

FILE *fp;

fp = fopen("records.txt" , "rb");
if( fp == NULL )
{
cout << "Error On File!" << endl;
cin.get();
cin.get();
exit(0);
}

student test;

fseek( fp, (recordNum - 1) * sizeof(test), 0);//fseek( fp , sizeof(test) , Seek_END)
fread( &test, sizeof(test), 1, fp);
printf("%d-%s\t%s\n" , recordNum , test.name , test.stdNum );

menu();
}
void menu()
{
cout << "A) Enter Student Record" << endl;
cout << "B) Show A Record By Number" << endl;
cout << "C) Exit" << endl;

char choice = NULL;
cin >> choice;

if ( choice == 'A' )
{
setRecord();
}
if( choice == 'B' )
{
showRecordByNum();
}
if( choice == 'C' )
{
exit(0);
}
else
{
cout << "Unrecongnized!" << endl << "Try Again." << endl;
menu();
}
}

int _tmain(int argc, _TCHAR* argv[])
{
menu();
return 0;
}

developing
سه شنبه 06 فروردین 1392, 10:52 صبح
با سلام

من فقط می تونم راهنماییتون کنم (چون این بهترین راه برای یادگیری برنامه نویسی هست)

شما دو تا راه دارید

1- استفاده از لیستهای پیوندی
2- استفاده از فایل با مشخصه ی مورد نظر

در مورد اول به کتابها یا در همین تالار مراجعه نمایید

در مورد دوم هم یعنی اینکه مثلا شما مقدار فضایی رو که رکورد مورد نظرتون نیاز داره (دراینجا 32 بایت) رو حساب می کنید
بعد یک بلاک به اندازه ی رکوردتون در نظر می گیرید.

بعد یک فایل ایجاد می کنید که رکوردها رو در بلاک های مورد نظر وارد می کنه
مثلا
رکورد یک از بایت 0 تا بایت 31 (از 0*32 تا 1*32 منهای 1)
رکورد دوم از بایت 32 تا بایت 63 (32*1 تا 32*2 منهای 1 )
و ...
حالا زمانی که می خواید معکوس رکورد ها رو چاپ کنید کافیه مثلا به شماره رکوردها دقت کنید.