Записать файл и прочитать файл на C

Я делаю домашнее задание и готовлюсь к выпускному экзамену. Вот моя проблема:

Квадратная матрица (nxn)

Запишите четные элементы в matran.txt, затем прочитайте их из файла и отобразите на экране.

Код:

//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");

}

Я знаю, что у него есть ограничение от 0->n, но я не знаю, что такое ограничение i, и я попробовал установить ограничение на 100, но он все равно распечатывает 3 значения и отображает 100 diff-адресов:

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

Это полная программа

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

Введите n=32468
в matran.txt: 2 4 6 8
Вывод: 2 4 6 8

Не зная, как выглядит код, вызывающий ваш код, что находится в файле «matrix.txt» и для чего предназначена эта функция, мы не сможем сказать, корректен ли этот код, а если нет, то что с ним не так. это. Единственное, что мы можем сказать наверняка, это то, что он пропускает память, выделенную из malloc, потому что нет свободного сопоставления и он не возвращает указатель. Но дальше этого мы можем только догадываться.

David Schwartz 29.03.2024 19:02

Несвязано: пожалуйста, возьмите за привычку использовать завершающую новую строку в вызове printf. Когда stdout (это FILE *, где пишет printf) подключен к консоли или терминалу, он будет буферизован по строкам. Это означает, что вывод будет фактически записан, когда вы печатаете новую строку. Используя начальную новую строку, вы печатаете предыдущую строку, а не текущую. Это может привести к ошибочному выводу при использовании printf для отладки.

Some programmer dude 29.03.2024 19:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
100
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В рутине DocTep вы не будете знать заранее, сколько пунктов вам нужно прочитать. (Так откуда же берется параметр n?)

Если все, что вам нужно сделать, это распечатать четные значения, найденные в infile, вам не нужно беспокоиться об управлении памятью для **p или хранении значений. Вы можете использовать цикл while, который завершается при достижении конца файла (о чем вам может сообщить процедура feof()), или использовать возвращаемое значение fscanf, чтобы сообщить, когда больше не осталось значений для чтения.

Другие вопросы по теме