Есть много, много способов сделать это. Если вы знаете, что у вас будет 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...
)