Как заполнить матрицу информацией о файле в C? - PullRequest
0 голосов
/ 25 января 2019

Я изучаю C, но у меня проблема с упражнением.Мне нужно заполнить матрицу, которую я начал с нуля, информацией о файле.Файл содержит некоторые координаты, и мне нужно поместить в матрицу числа, которые содержат файл, но в строке координат, перед которой файл дает мне.

Например, если у меня есть этот файл:

2,3 4 3 1
3,1 3 2 2
1,4 1 2 8 

Мне нужно, чтобы моя окончательная матрица выглядела следующим образом:

0 0 0 1 2 8
0 0 4 3 1 0
3 2 2 0 0 0
0 0 0 0 0 0

Мой код: (открывает только файл и создает матрицу, потому что я ищу информацию или примеры,но не могу найти ничего полезного)

#include <stdio.h>
int main(){
FILE *data;
data = fopen("example.txt","r");
if (data == NULL)
{                           
  printf("\nERROR\n");  
    return -1;
}
int row = 4;
int col = 6;
int matrix[row][col];
for (int x = 0; x < row; ++x)
{
    for (int y = 0; y < col; ++y)
    {
        matrix[x][y]=0;
    }
}
fclose(data);
for (int x = 0; x < row; ++x)
{
    for (int y = 0; y < col; ++y)
    {
        printf("[%d]",matrix[x][y]);
    }
    printf("\n");
}
return 0;
}

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Есть много, много способов сделать это. Если вы знаете, что у вас будет 2 координаты и 3 значения в каждой строке, то один из самых простых и надежных способов обработки чтения и анализа данных из каждой строки - это чтение каждой строки в буфер с fgets и затем проанализируйте строку в отдельных координатах с помощью sscanf. 1 Хотя вы можете сделать то же самое с помощью одного вызова fscanf, чтение с помощью fgets застрахует вас потреблять всю строку данных каждый раз и позволяет проводить независимую проверку вашего (1) чтения данных из файла; и (2) разбор данных в ваши координаты и значения.

Затем вам просто нужно отобразить ваши координаты в действительные C-индексы путем вычитания 1 (помните массивы в C a на основе нуля не на основе одного ), убедитесь, что ваши координаты действительны, чтобы запись 3 значений, начиная с ваших индексов, не записывалось за пределы вашего массива, и, наконец, циклическая запись ваших 3-значений в строку x, начинающуюся с y индекс.

Простая реализация может быть:

#include <stdio.h>

#define NVAL    3   /* if you need a constant, #define one (or more) */
#define ROW     4
#define COL     6
#define MAXC 1024

int main (int argc, char **argv) {

    char buf[MAXC];     /* buffer to hold each line read with fgets */
    int matrix[ROW][COL] = {{0}};   /* 2D array initialized all zero */
    /* use filename provided as 1st argument (stdin by default) */
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!fp) {  /* validate file open for reading */
        perror ("file open failed");
        return 1;
    }

    while (fgets (buf, MAXC, fp)) {         /* read each line into buf  */
        int x, y, data[NVAL] = {0};         /* declare coords/data vars */
        if (sscanf (buf, "%d,%d %d %d %d",  /* parse line into values   */
                    &x, &y, &data[0], &data[1], &data[2]) != 5) {
            fputs ("error: invalid line format.\n", stderr);
            continue;   /* skip to next line on error */
        }
        x = x - 1;  /* convert coords to zero based index for C */
        y = y - 1;
        if (x < ROW && y <= COL - NVAL) {   /* check valid indexes */
            for (int i = 0; i < NVAL; i++)  /* loop over each value */
                matrix[x][y++] = data[i];   /* write numbers to array */
        }
    }
    if (fp != stdin) fclose (fp);   /* close file if not stdin */

    for (int i = 0; i < ROW; i++) {         /* loop over rows */
        for (int j = 0; j < COL; j++)       /* loop over cols */
            printf ("%2d", matrix[i][j]);   /* outputting values */
        putchar ('\n');                     /* tidy up with newline */
    }

    return 0;
}

Пример входного файла

$ cat dat/matcoords.txt
2,3 4 3 1
3,1 3 2 2
1,4 1 2 8

Пример использования / Вывод

$ ./bin/matrix_data_at_coords <dat/matcoords.txt
 0 0 0 1 2 8
 0 0 4 3 1 0
 3 2 2 0 0 0
 0 0 0 0 0 0

Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.

примечания:

1. Примечание. Ни одно из семейства scanf не предоставляет возможности сообщения об ошибках, кроме как успешно / неудачно. Для получения подробных отчетов об ошибках для преобразования чисел используйте семейство функций strtoX (например, strtol, strtoul, strtod, etc...)

0 голосов
/ 25 января 2019

Попробуйте это

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

int main()
{
 char string[99];   
 FILE *data;
int row = 4;
int col = 6;
int y=0;
int matrix[row][col];
int matrixrow,position, s1 , s2 , s3 ;

for (int x = 0; x < row; ++x)
{
    for (int y = 0; y < col; ++y)
    {
        matrix[x][y]=0;
    }
}

 data=fopen("example.txt"   ,"r");

 while( fgets( string , 10 , data))
 {
 // each row we expect int comma int space int space int space int space
 // first int is row , int after comma is position , next 3 ints are data to stuff at position
 matrixrow =(string[0]- '0')-1;  // substract 0 to get int
 position=(string[2]- '0')-2;
 s1=string[4]- '0';
 s2=string[6]- '0';
 s3=string[8]- '0';

 matrix[matrixrow][position+1]=s1;
 matrix[matrixrow][position+2]=s2;
 matrix[matrixrow][position+3]=s3;

 printf("\n\nfrom text file matrix");
 printf("\n%s", string);
 printf("\noutput");
 printf("[%d]", matrixrow);
 for( y=0 ; y<col-1 ; y++)
   printf("[%d]", matrix[matrixrow][y]);
}

printf("\n\nPrint whole matrix\n" );
 for (int x = 0; x < row; ++x)
{
    for (int y = 0; y < col; ++y)
    {
        printf("[%d]",matrix[x][y]);
    }
    printf("\n");
}


fclose(data);

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