Как использовать пользовательский ввод, чтобы открыть текстовый файл, а затем загрузить его в 2D-массив? - PullRequest
0 голосов
/ 10 ноября 2018

Это то, что у меня есть в моем текстовом файле.

6814,85,86,92,88
7234,76,81,84,78
6465,87,54,68,72
7899,92,90,88,86
9901,45,78,79,80
8234,77,87,84,98
7934,76,91,84,65
7284,56,81,87,98
7654,76,87,84,88
3534,86,81,84,73

И это то, что я кодировал.

void getName(float arr1[x][y])
{
  FILE* graFile;
  float arr2[x][y];
  char userIn[50];
  printf("Enter filename: ");
  scanf("%s", userIn);
  graFile = fopen(userIn, "r");
  int studentId, test1, test2, test3, test4;

  for(int i = 0; i < x; i++)
  {
    for(int j = 0; j < y; j++)
    {
      fscanf(graFile, "%d%d%d%d%d%f", &studentId, &test1, &test2, &test3, &test4, &arr2[i][j]);
      arr2[0][0] = studentId;
      arr2[0][1] = test1;
      arr2[0][2] = test2;
      arr2[0][3] = test3;
      arr2[0][4] = test4;
    }
  }
  for(int i = 0; i < x; i++)
  {
    for(int j = 0; j < y; j++)
    {
      printf("%f", arr2[i][j]);
    }
    printf("\n");
  }
  fclose(graFile);
  return;
}

Мне нужно написать программу, которая просит пользователя ввести имя текстового файла (который содержит оценки), а затем загрузить его в двумерный массив. Затем я должен отсортировать оценки и взять средние оценки. Я начинаю с моей первой функции, которая заключается в том, чтобы получить пользовательский ввод для имени текстового файла и загрузить его в 2D-массив. Я все еще новичок в программировании на C, и мне трудно разобраться с 2D-массивами. Я ценю любую помощь, которую могу получить.

1 Ответ

0 голосов
/ 10 ноября 2018

следующий предложенный код:

  1. чисто компилирует
  2. выполняет желаемую функциональность
  3. правильно «печатает» переменные для ожидаемого ввода
  4. правильно проверяет наличие ошибок
  5. использует puts() при необходимости
  6. правильно выводит сообщения об ошибках на stderr
  7. позволяет избежать ненужных объявлений переменных и копирования данных
  8. последовательно отступает код
  9. использует горизонтальный интервал, если необходимо, для удобства чтения
  10. правильно использует строку формата в вызовах printf()
  11. разделяет блоки кода: for if else while do...while switch case, default через одну пустую строку для удобства чтения

и теперь предложенный код:

#include <stdio.h>
#include <stdlib.h>

#define MAX_FILENAME_LEN 50

void getName( int x, int y )
{
    int  arr2[x][y];
    char userIn[ MAX_FILENAME_LEN ];
    FILE* graFile;

    printf("%s", "Enter filename: ");
    if( scanf("%49s", userIn) != 1)
    {
        fprintf( stderr, "scanf failed to read file name\n" );
        exit( EXIT_FAILURE );
    }

    // implied else, scanf successful

    graFile = fopen(userIn, "r");

    if( !graFile )
    {
        perror( "fopen failed" );
        exit( EXIT_FAILURE );
    }

    // implied else, fopen successful

    for(int i = 0; i < x; i++)
    {
        if( fscanf( graFile, 
                    "%d%d%d%d%d", 
                    &arr2[i][0], 
                    &arr2[i][1], 
                    &arr2[i][2],
                    &arr2[i][3],
                    &arr2[i][4] ) != 5 )
        {
            fclose( graFile );
            fprintf( stderr, "fscanf failed to read row %d from the input file\n", i );
            exit( EXIT_FAILURE );
        }
    }

    fclose(graFile);

    for(int i = 0; i < x; i++)
    {
        for(int j = 0; j < y; j++)
        {
            printf("%d", arr2[i][j]);
        }

        puts( "" );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...