Hỏi về đọc ghi ma trận qua FILE trong C

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) == '\n')
			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,"\n");
	}
	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 đỡ :blush:

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

2 Likes

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);
}

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

1 Like

ý 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 :smiley:

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” ?
2 Likes

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

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