30/09/2018, 20:08

[FILE trong C] hỏi về đọc ghi ma trận

chào mọi người, đề bài của em là viết hàm đọc ma trận từ tập tin matrixin và xuất ra tập tin matrixout. Đây là code của em

// BT2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <conio.h>

void docMaTran(int **&arr, int &d, int &c)
{
	int k = 0;
	FILE *f = fopen("matrixin.txt", "r");
	while (!feof(f))
	{
		if (fgetc(f) == ' ')
			k++;
		if (fgetc(f) == '
')
			d++;
	}
	c = (k / d) + 1;
	arr = new int*[d];
	for (int i = 0; i < d; i++)
	{
		arr[i] = new int[c];
		for (int j = 0; j < c; j++)
		{
			fscanf(f, "%d", &arr[i][j]);
		}
	}
	fclose(f);
}

void ghiMaTran(int **arr, int d, int c)
{
	FILE *f = fopen("matrixout", "w");
	for (int i = 0; i < d; i++)
	{
		for (int j = 0; j < c; j++)
		{
			fprintf(f, "%d", arr[i][j]);
		}
		fprintf(f,"
");
	}
	fclose(f);
}

int _tmain(int argc, _TCHAR* argv[])
{
	int **arr, d, c;
	docMaTran(arr, d, c);
	ghiMaTran(arr, d, c);
	for (int i = 0; i < d; i++)
	{
		delete[]arr[i];
	}
	delete[]arr;
	_getch();
	return 0;
}

em không biết đã sai chỗ nào. mong được mọi người giúp đỡ

Gió viết 22:09 ngày 30/09/2018

sau vòng while để đếm k, d thì bạn đã đọc hết file rồi. Do đó để đọc lại từ đầu file bạn nên thêm lệnh rewind(f); sau vòng while

Lâm Khả Hân viết 22:21 ngày 30/09/2018

không biết mình làm vậy còn sai gì nữa mà lại bị bug, mong bạn xem giúp mình

void docMaTran(int **&arr, int &d, int &c)
{
	int k = 0;
	FILE *f = fopen("matrixin.txt", "r");
	while (!feof(f))
	{
		if (fgetc(f) == ' ')
			k++;
		if (fgetc(f) == '\n')
			d++;
	}
	c = (k / d) + 1;
	rewind(f);
	while (!feof(f))
	{
		arr = new int*[d];
		for (int i = 0; i < d; i++)
		{
			arr[i] = new int[c];
			for (int j = 0; j < c; j++)
			{
				fscanf(f, "%d", &arr[i][j]);
			}
		}
	}
	fclose(f);
}
Gió viết 22:15 ngày 30/09/2018

Nếu file của bạn định dạng đúng thì bạn nên bỏ cái while(!feof... sau đi bởi nó sẽ đọc lại 1 lần nữa nên bị sai

Lâm Khả Hân viết 22:14 ngày 30/09/2018

ý bạn là sao ạ? không phải rewind(f) là đưa con trỏ lên đầu sau đó đọc lại từ đầu sao?
mình cũng phải đọc lại lần nữa để đọc từng phần tử chứ ạ? không biết mình hiểu vậy có sai không nữa? mong bạn giải đáp

Gió viết 22:19 ngày 30/09/2018

Không phải code bạn có 2 vòng while đó sao. Ý là bỏ while sau thôi.
Bug thì có nhiều lí do:

  • các số có cách nhau= 1 dấu " "?
  • các dòng đều kết thúc= “\n” ?
Lâm Khả Hân viết 22:21 ngày 30/09/2018

ý là đếm khoảng cách với xuống dòng thì đếm để xây ma trận

Bài liên quan
0