Thắc mắc về file khi có struct

Chào mọi người , do em mới học về file của c++ nên chưa hiểu rõ .Cao nhân nào có thể trả lời cho em với ,em cảm ơn
Câu hỏi thứ nhất của em là:tại sao khi goi hàm void doctep thì chỗ struct lại dùng toán tử * chứ ko phải là toán tử &
câu hỏi thứ hai: Trong hàm void doctep thì sau khi kết thúc hàm thì ko thể đóng lại tệp ạ?
code:

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

typedef struct canbo
{
	char ma[10];
	char ho[10];
	char ten[10];
	float luong;
};

void doctep(canbo *x,int &a)
{
	fstream file("canbo.txt",ios::in);
	if(!file)
	{
		cout<<"khong the mo duoc tep!"<<endl;
		exit(1);
	}
	file>>a;
	for(int i=0;i<a;i++)
	{
		file>>x[i].ma;
		file>>x[i].ho;
		file>>x[i].ten;
		file>>x[i].luong;
	}
}

void output(canbo*x,int a)
{
	cout << "--------------------------------------------------" << endl;
	cout<<left;
	cout<<"| "<<setw(10)<<"ma cb"<<"| "<<setw(10)<<"ho "<<"| ";
	cout<<setw(10)<<"ten"<<"| "<<setw(10)<<"luong"<<"|"<<endl;
	for(int i=0;i<a;i++)
	{
		cout<<"| "<<setw(10)<<x[i].ma<<"| "<<setw(10)<<x[i].ho<<"| ";
		cout<<setw(10)<<x[i].ten<<"| "<<setw(10)<<x[i].luong<<"|"<<endl;
	}
	cout << "--------------------------------------------------" << endl;

}

void sapxep(canbo*x,int a)
{
	canbo tg;
	for(int i=0;i<a;i++)
	{
		for(int j=i+1;j<a;j++)
		{
			if(strcmp(x[i].ten,x[j].ten)<0)
			{
				tg=x[i];
				x[i]=x[j];
				x[j]=tg;
			}
		}
	}
}

void ghi_luong10(canbo*x,int a)
{
	fstream file("canbo.txt",ios::out|ios::app);
	if(!file)
	{
		cout<<"khong the tao duoc teo"<<endl;
		exit(1);
	}
	file<<"nhung can bo co luong tren 10 trieu la:\n";
	for(int i=0;i<a;i++)
	{
		if(x[i].luong>10000000)
		{
			file<<x[i].ma<<"\t";
			file<<x[i].ho<<"\t";
			file<<x[i].ten<<"\t";
			file<<x[i].luong<<"\n";
		}
	}
	
	file<<"\ncan bo theo ten giam dan la:\n";
	for(int i=0;i<a;i++)
	{
		file<<x[i].ma<<"\t";
		file<<x[i].ho<<"\t";
		file<<x[i].ten<<"\t";
		file<<x[i].luong<<"\n";
	}
	file.close();
}

int main()
{
	canbo cb[10];
	int n;
	doctep(cb,n);
	output(cb,n);
	sapxep(cb,n);
	ghi_luong10(cb,n);
	return 0;
}
  1. canbo *x, int &a một bên là con trỏ (*) và một bên là tham chiếu (&).
    Con trỏ và tham chiếu cũng gần giống nhau. Con trỏ có trong cả C và C++, nhưng tham chiếu chỉ có trong C++.
  2. Vì hàm hủy (destructor) đã làm điều đó rồi. Biến cục bộ trong 1 hàm sẽ bị hủy khi hàm kết thúc.
3 Likes

Anh có thể giải thích rõ cho em về hàm huỷ đc ko ạ? Trên lớp em chưa đc nghe nói đến ạ

Mong anh giải đáp chi tiết cho em câu thứ 2 ạ.Em cảm ơn!

Vì biến tạo bên trong hàm luôn tự hủy sau khi hàm kết thúc, mà stream đã cài đặt là mỗi khi hàm hủy được gọi thì nó cũng gọi đến close.

#include <iostream>
class Test{
    static int c;
    public:
    Test(){
        ++c;
        std::cout << "Constructed: " << c << std::endl;
    }
    ~Test(){
        std::cout << "Destructing: " << c << std::endl;
        this->close(); // gọi close trong hàm hủy.
        std::cout << "Destructed: " << c << std::endl;
    }
    
    void read(){
        std::cout << "read something in " << c << std::endl;
    }
    void close(){
        std::cout << "closed: " << c << std::endl;
    }
};
int Test::c = 0;

void func(){
    Test t;
    t.read();
    // t.close();
    // tự động bị hủy khi ra khỏi hàm.
}
int main()
{
    func(); // 1
    func(); // 2
    return 0;
}

Kết quả:

Constructed: 1
read something in 1
Destructing: 1
closed: 1
Destructed: 1
Constructed: 2
read something in 2
Destructing: 2
closed: 2
Destructed: 2

Chạy thử: https://onlinegdb.com/U95g3bRZY

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?