PDA

View Full Version : ذخیره اطلاعات در فایل و همچنین خواندن از فایل



imdeveloper
چهارشنبه 09 دی 1394, 22:06 عصر
سلام
من سورس کد زیر رو برای شبیه سازی دفتر نمره نوشتم حالا مشکلی که الان داره اینه که اولا موقع ثبت دانش آموزش اگر کاربر شماره دانشآموزی رو حرف هم وارد بکنه برنامه به کاربر پیغامی نمیده و اینکه توی ذخیره در فایل و خواندن از فایل مشکل دارم
ممنون میشم راهنمایی کنید :

#include "stdafx.h"
#include "iostream"
#include "conio.h"
#include "string"
#include "windows.h"
#include "fstream"
#include "vector"

using namespace std;

int i, j, x;
void addpresent(void);
class Student {
private:
string id;
string FullName;
bool Present[16];
int score;
public:
void setName(string);
string getName();
void setid(string);
string getid();
void setscore(int);
int getscore();
void setPresent(int, bool);
void getpresent();
};
Student student;
vector<Student> Student_Vector;

void Student::setName(string n) {
FullName = n;
}
string Student::getName() {
return FullName;
}
void Student::setid(string b) {
id = b;
}
string Student::getid() {
return id;
}
void Student::setscore(int s) {
score = s;
}
int Student::getscore() {
return score;
}
void Student::setPresent(int k, bool p){
Present[k] = p;
}
void Student::getpresent(){
cout << "\t________________________\n";
for (int i = 0; i < 16; i++)
{
if (i+1 <= 9)
cout << "\t| Session " << i + 1 << ":" << Present[i] << " |\n";
else if (i+1 >= 10)
cout << "\t| Session " << i + 1 << ":" << Present[i] << " |\n";
}
cout << "\t|_______________________";
}
void addpresent() {
system("cls");
if (Student_Vector.empty())
cout << "\n\n\tList Is Empty" << "\n\t" << "Please Press Enter Key to Back..." << endl;

else {
cout << "\n\tEnter session(between 1 to 16):";
cin >> j;
while (j<1 || j> 16)
{
cout << "\n\n\tWrong number\n";
cout << "\n\tEnter session(between 1 to 16):";
cin >> j;
}
j--;
for (int i = 0; i <Student_Vector.size(); i++)
{
cout << "\n\tPlease Enter Student " << Student_Vector[i].getName() << " Present: ";
bool p = false;
cin >> p;
Student_Vector[i].setPresent(j, p);
}
cout << "\n\t" << "Please Press Enter Key to Back..." << endl;
}
}
void addscore() {
system("cls");
if (Student_Vector.empty())
cout << "\n\n\tList Is Empty" << "\n\t" << "Please Press Enter Key to Back..." << endl;

else {
system("cls");
for (int i = 0; i <Student_Vector.size(); i++)
{
int s;
cout << "\n\tPlease Enter Student " << Student_Vector[i].getName() << " Score: ";
cin >> s;
Student_Vector[i].setscore(s);
}
cout << "\n\t" << "Please Press Enter Key to Back..." << endl;

}
}
void studentlist() {
system("cls");
if (Student_Vector.empty())
cout << "\n\n\tList Is Empty" << "\n\t" << "Please Press Enter Key to Back..." << endl;

else {
cout << "\n\tStudent List: \n";
for (int i = 0; i < Student_Vector.size(); i++)
{
cout << "\n\tStudent " << i + 1 << " [Name:" << Student_Vector[i].getName() << ",Id:" << Student_Vector[i].getid() << "]" << " Persent:" << endl;
Student_Vector[i].getpresent();
cout << "\n";
cout << "\n\tScore:" << Student_Vector[i].getscore();
cout << "\n";
}
cout << "\n\t" << "Please Press Enter Key to Back..." << endl;

}
}
void removestudent() {
system("cls");
if (Student_Vector.empty())
cout << "\n\n\tList Is Empty" << "\n\t" << "Please Press Enter Key to Back..." << endl;

else {
system("cls");
int menu3;
cout << "\n\t\t" << "1.Search By Id" << endl;
cout << "\n\t\t" << "1.Search By Name" << endl;
cout << "\n\n\t" << "Please Enter Your Choice (1-2) ";
cin >> menu3;
switch (menu3) {
case 1:
{
string index;
cout << "\n\tEnter Student Id:";
cin >> index;
for (int i = 0; i < Student_Vector.size(); i++)
{
if (Student_Vector[i].getid() == index) {
cout << "\n\n\t Item Removed ...: \n";
Student_Vector.erase(Student_Vector.begin() + i);
}
else {
cout << "\n\n\t Item didn't Found ...: \n";
}

}
cout << "\n\t" << "Please Press Enter Key to Back..." << endl;

}
break;
case 2:
{
string index;
cout << "\n\tEnter Student Name:";
cin >> index;
for (int i = 0; i < Student_Vector.size(); i++)
{
if (Student_Vector[i].getid() == index) {
cout << "\n\n\t Item Removed ...: \n";
Student_Vector.erase(Student_Vector.begin() + i);
}
else {
cout << "\n\n\t Item didn't Found ...: \n";
}
}
cout << "\n\t" << "Please Press Enter Key to Back..." << endl;

}
break;
default:
break;
}
}
}
void searchstudent() {
system("cls");
if (Student_Vector.empty())
cout << "\n\n\tList Is Empty" << "\n\t" << "Please Press Enter Key to Back..." << endl;

else {
system("cls");
int menu4;
cout << "\n\t\t" << "1.Search By Id" << endl;
cout << "\n\t\t" << "1.Search By Name" << endl;
cout << "\n\n\t" << "Please Enter Your Choice (1-2) ";
cin >> menu4;
switch (menu4) {
case 1:
{
string index;
cout << "\n\tEnter Student Id:";
cin >> index;
for (int i = 0; i < Student_Vector.size(); i++)
{
if (Student_Vector[i].getid() == index) {
cout << "\n\n\t Item Found ...: \n";
cout << "\n\tStudent " << i + 1 << " [Name:" << Student_Vector[i].getName() << ",Id:" << Student_Vector[i].getid() << "]" << " Persent:" << endl;
Student_Vector[i].getpresent();
cout << "\n";
cout << "\n\tScore:" << "\t" << Student_Vector[i].getscore();
cout << "\n";
}
else {
cout << "\n\n\t Item didn't Found ...: \n";
}

}
cout << "\n\t" << "Please Press Enter Key to Back..." << endl;

}
break;
case 2:
{
string index;
cout << "\n\tEnter Student Name:";
cin >> index;
for (int i = 0; i < Student_Vector.size(); i++)
{
if (Student_Vector[i].getName() == index) {
cout << "\n\n\t Item Found ...: \n";
cout << "\n\tStudent " << i + 1 << " [Name:" << Student_Vector[i].getName() << ",Id:" << Student_Vector[i].getid() << "]" << " Persent:" << endl;
Student_Vector[i].getpresent();
cout << "\n";
cout << "\n\tScore:" << "\t" << Student_Vector[i].getscore();
cout << "\n";
}
else {
cout << "\n\n\t Item didn't Found ...: \n";
}
}
cout << "\n\t" << "Please Press Enter Key to Back..." << endl;

}
break;
default:
break;
}
}
}
void WritingFileV1() {
system("cls");
if (Student_Vector.empty())
cout << "\n\n\tList Is Empty" << "\n\t" << "Please Press Enter Key to Back..." << endl;

else {
fstream myfile;
myfile.open("Student.txt", ios::out || ios::binary);
for (int i = 0; i < Student_Vector.size(); i++)
{
myfile.write((char*)&Student_Vector[i], sizeof(Student));
}
myfile.close();
cout << "\n\n\tSaved ...: \n";
cout << "\n\t" << "Please Press Enter Key to Back..." << endl;

}
}
void ReadFileV1()
{
string line;
int i = 0;
cout << "\n\n\tLoading ....: \n";
ifstream myfile("Student.txt");
if (myfile.is_open())
{
while (getline(myfile, line))
{
cout << "\n\t" << line << "\n";
// FullName[i] = line;
// i++;
}
myfile.close();
}
else cout << "Unable to open file" << "\n\t" << "Please Press Enter Key to Back..." << endl;

}
void AddStudent()
{
system("cls");
int menu2;
cout << "\n\t\t" << "1.Add One student" << endl;
cout << "\n\t\t" << "2.Add Some student" << endl;
cout << "\n\n\t" << "Please Enter Your Choice (1-2) : ";
cin >> menu2;
switch (menu2) {
case 1:
{
string n;
string b;
cout << "\n\t" << "Please Enter Student " << i + 1 << " Id: ";
cin >> b;
cout << "\n\t" << "Please Enter Student " << i + 1 << " FullName: ";
cin >> n;
student.setName(n);
student.setid(b);
Student_Vector.push_back(student);
cout << "\n\t" << "One student was successfully added!!" << "\n\t" << "Please Press Enter Key to Back..." << endl;

}
break;
case 2:
{
int k;
cout << "\n" << "Plese Enter Student Number:";
cin >> k;
for (j = 0; j < k; j++) {
string n;
string b;
cout << "\n\t" << "Please Enter Student " << j + 1 << " Id: ";
cin >> b;
cout << "\n\t" << "Please Enter Student " << j + 1 << " FullName: ";
cin >> n;
student.setName(n);
student.setid(b);
Student_Vector.push_back(student);

}
cout << "\n\t" << k << " student was successfully added!!" << "\n\t" << "Please Press Enter Key to Back..." << endl;

}
break;
default:
break;
}
}
int Menu()
{
int input;
cout << "\n\n" << endl;
cout << "\t\t" << "--- WELCOME ---" << "\n" << endl;
cout << "\t\t" << "| 1.Add Student " << endl;
cout << "\t\t" << "| 2.Add Present " << endl;
cout << "\t\t" << "| 3.Add Score " << endl;
cout << "\t\t" << "| 4.Student List " << endl;
cout << "\t\t" << "| 5.Search " << endl;
cout << "\t\t" << "| 6.Remove " << endl;
cout << "\t\t" << "| 7.Save To File " << endl;
cout << "\t\t" << "| 8.Open File " << endl;
cout << "\t\t" << "| 9.Exit " << "\n" << endl;
cout << "\t\t" << "_______________________" << endl;
cout << "\n\n" << endl;
cout << "\t\t" << "Please Enter Your Choice (1-7) : ";
cin >> input;
return input;
}
int Login()
{
string Username;
string Password;
cout << "\n\n" << endl;
cout << "\t\t" << "--- Please Enter Username & Password ---" << endl;
cout << "\n\t\t" << "| Username : ";
cin >> Username;
cout << "\n\t\t" << "| Password : ";
cin >> Password;

if (Username == "Admin" && Password == "Admin")
return 1;
else
return 0;
}
int main() {
int i = 0;
int j;
while (true)
{
switch (Login())
{
case 1:
{
while (true) {

system("cls");
switch (Menu())
{
case 1:
AddStudent();
break;
case 2:
addpresent();
break;
case 3:
addscore();
break;
case 4:
studentlist();
break;
case 5:
searchstudent();
break;
case 6:
removestudent();
break;
case 7:
WritingFileV1();
break;
case 8:
ReadFileV1();
break;
case 9:
return 0;
break;
default:
return 0;
break;

}
cin.get();
cin.get();
}
case 0:
system("cls");
cout << "\n\t\t" << "**wrong!!" << endl;
cout << "\t\t" << "The Username and Password you entered don't match. " << endl;
break;
default:
break;
}
}
}


}

Poores
جمعه 11 دی 1394, 00:36 صبح
چون برنامهتون خیلی طولانیه و واقعا خوصله خوندن و عیب یابی ندارم

به صورت کلی میگم :

واسه دریافت شماره دانش آموزش از رشته استفاده کنین ! و بعد داخل یک حلقه چک کنین که حرف وارد نکرده باشه :

string studentNO;
cin >> studentNO;
bool isitnumber = 1;
for (int i = 0; i<studentNO.length() && isitnumber; i++)
if (studentNO[i] >'0' || studentNO[i] < '9')
isitnumber == 0;



اگه بعد از پایان حلقه isitnumber مقدارش 1 باشه یعنی ورودی کاربر عدد هست در غیر اینصورت کاربر حرف وارد کرده ! میتونین اینو داخل یک do while بزارین که اگه حرف وارد کرده بود دوباره وارد کنه!
------------
درمورد ذخیره و بازیابی از فایل ، کتابخانه fstream استفاده میشه
به اینصورت که اگه شما میخواین ذخیره کنین یک متغیر از جنس ofstream تعریف میکنین و بجای cout از اون متغیر تعریف میکنین.
-موقع تعریف باید آدرس فایلی که میخواهیم در آن ذخیره کنیم رو بنویسیم.
به این صورت :

ofstream out("out.txt");
out << "HI";


الان در کنار فایل cpp یک فایل out.txt ساخته خواهد شد که در آن HI ذخیره شده.

یا مثلا میتونیم بگیم :

ofstream x("out.txt");
int a = 555;
x<< "value of variable a is : " << a;

در آخر برنامه هم باید

out.close();


بنویسیم (گاهی ننوشتن این خط باعث ذخیره نشدن میشه!
==================
در مورد دریافت از فایل :
یک متغیر از جنس ifstream تعریف میکنیم به این صورت :

ifstream open("in.txt");

int s;
in >> s;


به اینصورت از فایل in.txt دریافت میکنیم.


کتابخانه fstream توابع کارآمد زیادی داره ، حتما
http://www.cplusplus.com/reference/fstream/fstream/
زو مطالعه کنید.

imdeveloper
جمعه 11 دی 1394, 11:37 صبح
چون برنامهتون خیلی طولانیه و واقعا خوصله خوندن و عیب یابی ندارم

به صورت کلی میگم :

واسه دریافت شماره دانش آموزش از رشته استفاده کنین ! و بعد داخل یک حلقه چک کنین که حرف وارد نکرده باشه :

string studentNO;
cin >> studentNO;
bool isitnumber = 1;
for (int i = 0; i<studentNO.length() && isitnumber; i++)
if (studentNO[i] >'0' || studentNO[i] < '9')
isitnumber == 0;



اگه بعد از پایان حلقه isitnumber مقدارش 1 باشه یعنی ورودی کاربر عدد هست در غیر اینصورت کاربر حرف وارد کرده ! میتونین اینو داخل یک do while بزارین که اگه حرف وارد کرده بود دوباره وارد کنه!
------------
درمورد ذخیره و بازیابی از فایل ، کتابخانه fstream استفاده میشه
به اینصورت که اگه شما میخواین ذخیره کنین یک متغیر از جنس ofstream تعریف میکنین و بجای cout از اون متغیر تعریف میکنین.
-موقع تعریف باید آدرس فایلی که میخواهیم در آن ذخیره کنیم رو بنویسیم.
به این صورت :

ofstream out("out.txt");
out << "HI";


الان در کنار فایل cpp یک فایل out.txt ساخته خواهد شد که در آن HI ذخیره شده.

یا مثلا میتونیم بگیم :

ofstream x("out.txt");
int a = 555;
x<< "value of variable a is : " << a;

در آخر برنامه هم باید

out.close();


بنویسیم (گاهی ننوشتن این خط باعث ذخیره نشدن میشه!
==================
در مورد دریافت از فایل :
یک متغیر از جنس ifstream تعریف میکنیم به این صورت :

ifstream open("in.txt");

int s;
in >> s;


به اینصورت از فایل in.txt دریافت میکنیم.


کتابخانه fstream توابع کارآمد زیادی داره ، حتما
http://www.cplusplus.com/reference/fstream/fstream/
زو مطالعه کنید.


ممنون از توضیحات کاملتون
اما من کد ذخیره و خوندن از فایل رو نوشتم ولی خب کار نمیکنه :
void WritingFileV1() {
system("cls");
if (Student_Vector.empty())
cout << "\n\n\tList Is Empty" << "\n\t" << "Please Press Enter Key to Back..." << endl;

else {
fstream myfile;
myfile.open("Student.txt", ios::out || ios::binary);
for (int i = 0; i < Student_Vector.size(); i++)
{
myfile.write((char*)&Student_Vector[i], sizeof(Student));
}
myfile.close();
cout << "\n\n\tSaved ...: \n";
cout << "\n\t" << "Please Press Enter Key to Back..." << endl;

}
}
void ReadFileV1()
{
string line;
int i = 0;
cout << "\n\n\tLoading ....: \n";
ifstream myfile("Student.txt");
if (myfile.is_open())
{
while (getline(myfile, line))
{
cout << "\n\t" << line << "\n";
// FullName[i] = line;
// i++;
}
myfile.close();
}
else cout << "Unable to open file" << "\n\t" << "Please Press Enter Key to Back..." << endl;

}

Poores
جمعه 11 دی 1394, 19:19 عصر
نمونه نوشتن در فایل:

#include <fstream>
using namespace std;


int main(){
std::ofstream outfile("test.txt", std::ofstream::binary);
char *s = new char[100];
s = "QWE";
outfile.write(s, 3);
outfile.close();
system("pause");
return 0;
}


نمونه گرفتن ورودی از فایل :

#include <fstream>
#include <iostream>
using namespace std;


int main(){
std::ifstream infile("test.txt", std::ifstream::binary);

infile.seekg(0, infile.end); // ferestadane neshangar be akharin character
long size = infile.tellg(); // gereftane makane namayeshgar (ke mishe size file)
infile.seekg(0); // ferestadane neshangar be ebtedaye file

char *s = new char[100];
infile.read(s, size); // khandane az file

cout << s << endl;

system("pause");
return 0;
}


روش کلی کار همین هست

imdeveloper
جمعه 11 دی 1394, 21:09 عصر
نمونه نوشتن در فایل:

#include <fstream>
using namespace std;


int main(){
std::ofstream outfile("test.txt", std::ofstream::binary);
char *s = new char[100];
s = "QWE";
outfile.write(s, 3);
outfile.close();
system("pause");
return 0;
}


نمونه گرفتن ورودی از فایل :

#include <fstream>
#include <iostream>
using namespace std;


int main(){
std::ifstream infile("test.txt", std::ifstream::binary);

infile.seekg(0, infile.end); // ferestadane neshangar be akharin character
long size = infile.tellg(); // gereftane makane namayeshgar (ke mishe size file)
infile.seekg(0); // ferestadane neshangar be ebtedaye file

char *s = new char[100];
infile.read(s, size); // khandane az file

cout << s << endl;

system("pause");
return 0;
}


روش کلی کار همین هست

ممنون از توضیحاتتون
ولی من چون دارم با وکتور کار میکنم به مشکل خوردم
ممنون میشم کدی که من نوشتم رو چک کنید :ناراحت:

Poores
جمعه 11 دی 1394, 21:45 عصر
دوست عزیز دو نمونه کد برای شما نوشتم باید بتونین از این نمونه ها در کدتون استفاده کنین.

اول اینکه

fstream myfile; myfile.open("Student.txt", ios::out || ios::binary);




به جای این کار

std::ofstream outfile("Student.txt", std::ofstream::binary);


اینطوری تعریف کن!

دوم شما درمورد کار تابع sizeof اشکال دارید. تابع sizeOf تعداد خانه های وکتور یا آرایتون رو بر نمیگرداند بلکه میزان حافظه اشغالی آنرا بر میگرداند مثلا

int a = 10;
cout << Sizeof(a);

مقداری که چاپ خواهد شد 4 هست چون میزان حافظه ای که یک متغیر از نوع int اشغال میکند برابر 4 بایت هست.
------------------------
و اما یک مورد دیگر ! شما یک کلاس تعریف کردین به اسم student :

class Student {
private:
string id;
string FullName;
bool Present[16];
int score;
public:
void setName(string);
string getName();
void setid(string);
string getid();
void setscore(int);
int getscore();

void setPresent(int, bool);
void getpresent();
};




که یک سری تابع و یک سری متغیر داره ، و یک وکتور از این کلاس تعریف کردین به اسم Student_Vector ، و حالا می خواین این وکتور رو داخل یک فایل ذخیره کنین و بعدا اونو از فایل load کنین.
خوب تا اینجا که صورت مسئله ، ببینید شما وقتی

char*)&Student_Vector[i]

اینو مینویسین یعنی دارین کلاستون رو به char * کست یا تبدیل میکنین! مگه داریم؟ مگه میشه؟!!!!

شما باید هر یک از عناصر وکتورتون رو جدا ذخیره کنین ، مثلا :

outfile.write(Student_vector[i].getname(), Student_vector[i].getname().size());

zero_ox
جمعه 11 دی 1394, 21:54 عصر
سلام
دویست خطش اضافیه .
تابع منو رو می تونستی تو توابع دیگه فراخونی کنی .
تابع getline(cin,char*) به این صورت هست نه ا ینکه اشاره گرفایل رو باهاش بگیری.
همه اینا رو به عنوان مشخصات دانش آموز تو یه تابع بگیر با تعریف یه آرایه ازکلاس .

string id; string FullName;
bool Present[16];
int score;


حالا چه اصراری داری ارتوابع خواندن ونوشتن باینری استفاده کنی ازهمون صورتی که دربالا توضیح داده استفاده کن .

ofstream out;
ifstream if;

imdeveloper
چهارشنبه 16 دی 1394, 12:09 عصر
سلام
شرمنده من هنوز موفق نشدم اینو اوکی کنم
ممنون میشم کمک کنید :((