01/10/2018, 08:28

Đọc mảng 2 chiều (ma trận) từ file txt bằng con trỏ cấp 2

Hi all em có bt đang bí về đọc FILE trong c++ mong ae giúp đỡ.
Đề: cho file txt nội dung chứa nội dung:
4
0 1 1 0
1 0 1 0
1 1 0 0
0 0 0 0

bool docMaTran(char* file, int &soDinh, bool** &maTran)
{
	FILE* f = fopen(file, "r");
	if (f == NULL)
		return false;
	
	fscanf(f, "%d", &soDinh);//Doc so dinh
	//doc ma tran 
	maTran=  new bool*[soDinh];// cap phat vung nho
	for(int i=0; i<soDinh; i++)
		maTran[i] = new bool [soDinh];
	{
	
	for(int i=0; i<soDinh; i++)
	{
		for(int j= 0; j<soDinh; j++)
			fscanf(f, "%d", &maTran);
			
	}
	}
	fclose(f);
	return true;
}

MAIN

nt _tmain(int argc, _TCHAR* argv[])
{
	// 1. Đọc dữ liệu
	char* file = "input.txt";
	int soDinh= 0; // Khởi tạo
	bool** maTran= NULL; // Khởi tạo
	
	bool kq= docMaTran(file, soDinh, maTran);
	if (kq== false)
	{
		printf("Cannot open file %s
", file);
		return 1;
	}
	// Test
	printf("so dinh la: %d
", soDinh);
	printf("Ma Tran: 
");
	
	for (int i = 0; i < soDinh; i++)
	{

		for (int j = 0; j < soDinh; j++)
		{
			printf("%d ", maTran[i][j]);
		}
		printf("
");
	}
	printf("
");
	
return 0;
}

Em đọc được số đỉnh còn ma trận ko đọc được, mong chỉ giáo

Người bí ẩn viết 10:29 ngày 01/10/2018

bool docMaTran(char* file, int &soDinhs, bool** &maTran)

Tham số có đúng chưa (tham số soDinhs ấy) ?

fscanf(f, “%d”, &numVertexes);//Doc so dinh

Biến numVertexes ở đâu ra thế ? phải là soDinh chứ !

{
	
	for(int i=0; i < soDinh; i++)
	{
		for(int j= 0; j < soDinh; j++)
			fscanf(f, "%d", &maTran);
			
	}
	}

Sao cái chỗ này mở đóng ngoặc tùm lum vậy, copy đoạn code chính xác rồi paste đoạn code lên đây, bao phủ đoạn code bởi cặp thẻ tag [code][/code].
maTran là con trỏ cấp 2 sao lại dùng fscanf(f, "%d", &maTran); trong vòng lặp ?

nt _tmain(int argc, _TCHAR* argv[])

Chương trình bạn không sử dụng tham số dòng lệnh thì để như thế làm gì ? Mà viết sai rồi kìa, thiếu chữ “i” ở đầu dòng.
Tuy _tmain() là 1 extension của Microsoft C++ Compiler nhưng nó không phải chuẩn nên hạn chế dùng !

Mà code C thì không nên dùng tham chiếu, hãy dùng con trỏ.

Kiên viết 10:40 ngày 01/10/2018

File chứa hàm docMaTran

#include "stdafx.h"
bool docMaTran(char* file, int &soDinh, bool** &maTran)
{
	FILE* f = fopen(file, "r");
	if (f == NULL)
		return false;
	//Doc so dinh
	fscanf(f, "%d", &soDinh);
	//doc ma tran 
	maTran =  new bool*[soDinh];// cap phat vung nho
	for(int i=0; i<soDinh; i++)
		maTran[i] = new bool [soDinh];
	
	
	for(int i=0; i<soDinh; i++)
	{
		for(int j= 0; j<soDinh; j++)
			fscanf(f, "%d", &maTran);		
	}
	fclose(f);
	return true;
}

File chứa hàm main:



#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
	// 1. Đọc dữ liệu
	char* file = "input.txt";
	int soDinh = 0; // Khởi tạo
	bool** maTran = NULL; // Khởi tạo
	
	bool kq = docMaTran(file, soDinh, maTran);
	if (kq == false)
	{
		printf("ko the mo file %s\n", file);
		return 1;
	}
	// Test
	printf("so dinh: %d\n", soDinh);
	printf("Ma Tran: \n");
	
	for (int i = 0; i < soDinh; i++)
	{

		for (int j = 0; j < soDinh; j++)
		{
			printf("%d ", maTran[i][j]);
		}
		printf("\n");
	}
	printf("\n");

	return 0;
}

Đây ạ em sửa lại rồi đây,
về tham chiếu hay _tmain do GV yêu cầu vậy ạ, a sửa giúp e

Người bí ẩn viết 10:29 ngày 01/10/2018

char* file = "input.txt";

Nên để const char *file = "input.txt"; và sửa lại cái tham số đầu trên hàm docMaTran luôn.

fscanf(f, "%d", &maTran);

Như đã nói ở trên, maTran là con trỏ cấp 2 thì sao lại để như thế ?
Sửa lại thành: fscanf(f, "%d", &<tên mảng>[<chỉ số hàng>][<chỉ số cột>]);

Mà sao lại dùng kiểu bool cho con trỏ ?

Kiên viết 10:37 ngày 01/10/2018

fscanf(f, “%d”, &maTran[i][j]); cũng ko ra luôn
bool là vì GV e nói ma trận chỉ đánh số 01 nên dùng bool cho tiết kiệm

Người bí ẩn viết 10:40 ngày 01/10/2018

fscanf(f, “%d”, &maTran[i][j]); cũng ko ra luôn

File chứa hàm docMaTran

File chứa hàm main:

Cái đó là tùy cách bạn chia file như thế nào nữa. Ví dụ, 1 file.cpp chứa hàm main, 1 file.cpp chứa hàm đọc file mà không gọi vào thì nó cũng chẳng biết hàm đọc file ở đâu ra.

bool là vì GV e nói ma trận chỉ đánh số 01 nên dùng bool cho tiết kiệm

Cái đó là đối với data của file toàn là số 0 1. Chứ nếu số lớn hơn thì nên dùng int. Tuy nhiên bài tập chỉ cho data trong file toàn là số 0 1 nên dùng bool cũng được.

Kiên viết 10:34 ngày 01/10/2018

em đọc được r bác ạ

Bài liên quan
0