I am doing some homework and preparing for a final exam. Here is my problem:
A square matrix (nxn)
Write down the Even elements into matran.txt, then read from file and display it on screen
Code:
//this is function write down file matrix.txt, and it's work normally
void infile(int **p,int n)
{
bool a=false;
FILE *f=fopen("matran.txt","w");
if (f==NULL)
{
printf ("\nLoi file.");
exit(1);
}
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
if ((p[i][j]) % 2 == 0) {
fprintf (f,"%d\t",p[i][j]);
a=true;
}
}
if (a) printf ("\nFile da duoc ghi tai ./matrix.txt");
else printf ("\nKhong co so chan trong ma tran");
}
I know that it's has a limit from 0->n but I don't know what is limit of i and I tried set limit to 100 but it's still print out 3 values and it's display 100 diff address:
//but this didnt work
void DocTep(int **p, int n) {
int *ptr=(int*)malloc(n*sizeof(int));
FILE *f = fopen("matran.txt", "r");
if (f == NULL) {
printf("\nLoi file.");
exit (1);
}
for (int i = 0; i < n; i++) {
fscanf(f, "%d ",ptr[i]);
}
fclose(f);
printf ("\n");
for (int i = 0; i < n; i++) {
printf ("%d\t",ptr[i]);
}
}
This is full program
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void nhapmt (int **p,int n)
{
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("a[%d][%d] = ", i, j);
scanf("%d", &p[i][j]);
}
}
}
void inmt (int **p,int n)
{
for (int i=0;i<n;i++)
{
printf ("\n");
for (int j=0;j<n;j++)
{
printf ("%d\t",p[i][j]);
}
}
}
void tongcheo(int **p,int n)
{
int sum=0;
for (int i=0;i<n;i++)
{
sum += p[i][i];
}
printf ("\nTong cac so tren duong cheo chinh la: %d",sum);
}
void tongh(int **p,int n,int h)
{
int sum=0;
for (int i=0;i<n;i++)
{
sum += p[i][h];
}
printf ("Tong cot %d la: %d",h,sum);
}
void infile(int **p,int n)
{
bool a=false;
FILE *f=fopen("matran.txt","w");
if (f==NULL)
{
printf ("\nLoi file.");
exit(1);
}
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
if ((p[i][j]) % 2 == 0) {
fprintf (f,"%d\t",p[i][j]);
a=true;
}
}
if (a) printf ("\nFile da duoc ghi tai ./matran.txt");
else printf ("\nKhong co so chan trong ma tran");
}
void DocTep(int **p, int n) {
int *ptr=(int*)malloc(100*sizeof(int));
FILE *f = fopen("matran.txt", "r");
if (f == NULL) {
printf("\nLoi file.");
exit (1);
}
// fscanf(f,"%d",&ptr[0]);
for (int i = 0; i < n; i++) {
fscanf(f, "%d ",ptr[i]);
}
fclose(f);
printf ("\n");
for (int i = 0; i < n; i++) {
printf ("%d\t",ptr[i]);
}
}
int main()
{
int **p,n,h;
printf ("Hay nhap vao n: ");
scanf("%d",&n);
p=(int**)malloc(n*sizeof(int*));
for (int i=0;i<n;i++){
p[i]=(int*)malloc(n*sizeof(int));
}
nhapmt(p,n);
inmt(p,n);
tongcheo(p,n);
printf ("\nHay nhap vao h: ");
scanf("%d",&h);
tongh(p,n,h);
infile (p,n);
DocTep(p,n);
free(p);
return 0;
}
Input n=3 2 4 6 8
in matran.txt: 2 4 6 8
Output: 2 4 6 8
In the
DocTeproutine, you won't know in advance how many items you need to read. (So where is thenparameter coming from?)If all you need to do is print the even values that were found in
infile, you don't need to worry about managing the memory for**por storing the values. You can use awhileloop that terminates when you reach end-of-file (which thefeof()routine can tell you), or use the return value offscanfto tell when there are no more values left to read.