Ahoj, pár postřehů z rychlíku
1) Když deklaruješ proměnnou, tak ji co nejdříve také inicializuj a nečekej na chvíli, kdy ji budeš chtít použít. Velmi lehce se na to zapomíná a následky mohou být neblahé. Obzvláště to platí pro pointery!
2) Pokud nejsi schopný zaručit, že ti funkce neselže, pak vždy kontroluj alespoň její návratovou hodnotu, pokud něco vrací. V tomto případě se to týká funkce fopen( ), protože v případě, že se něco provede se souborem, který má otevřít (bude smazán, přejmenován, atd...) koleduješ si - v lepším případě - o segfault o pár řádku níže.
já chápu, že toto je studijní kód začátečníka. Přesto z vlastní zkušenosti považuji za důležité na to upozornit. Důsledky podobných opomenutí se v rozsáhlejším a komplexnějším kódu velmi špatně hledají. A nestačí o tom jen vědět, je potřeba si to vštípit do krve hned od začátku. Věř mi, že ti to hodně časem ulehčí život.
3) Proměnná i je zbytečná. Jenom ji inkrementuješ a a pak přiřadíš do max_i. Popřemýšlej, zda není lepší pracovat rovnou s max_i a i zrušit.
4) Navrhuji ti, abys přesunul podmínku max_j < j až za vnitřní cyklus. To proto, že V současné chvíli testuješ max_j proti všem pozicím elementů v řádku a to v každém cyklu opakovaně. Ale já bych řekl, tebe určitě zajímá, zda max_j neni náhodou menší než celkový počet elementů v řádku. A to budeš vědět až cyklus skončí.
Tyhle nedostatky přímo funkčnost neovlivní, ale jednak znamenají plýtváním zdrojů mašiny (časem procesoru a pamětí) a jednak hrubě znesnadní čtení kódu v případě rozsáhlejšího souboru. No jen si představ jak by se to četlo, když by jsi měl těch vnořených cyklů několik a byly o něco delší.
5) Pokud vyloženě není tvým záměrem zjišťovat, kolik řádků a kolik elementů v nich je ve vstupu navíc (alespoň v původním zadání o tom nic nebylo), tak já osobně bych z cyklu vyskočil, jakmile bych dosáhl MAX_COLS nebo MAX_ROWS. Tím si kód zpřehledníš a zjednodušíš, a odpadnou ti ty korekce před výpisem pole.
AHOJ A DIKY ZA VYBORNE POSTREHY
2) navratovu hodnotu fpopen() som osetril
4) max_j < j som tiez dal az za vnutorny cyklus
5) kvoli kontrole bolo mojim zamerom vypisat aj kolko riadkov a stlpcov ma vstupny subor.
Normalne by som nedeklaroval vsetky premenne na zaciatku main(), ale pomocne premenne deklaroval az na mieste kde ich idem pouzit, napr.: for (int i = 0; ...)
Dalej by som na jednotlive casti urobil samostatne funkcie, t.j.:
- funkciu ktora nacita nazov suboru z command line argumentu programu,
- funkciu ktora nacita data zo suboru do pola
- funkciu ktora vypise obsah pola
Dalo by sa na tom este dost popracovat, ale
tazatel tu nedava k tomu ziadny feedback 
takze to nema vyznam.
Pripajam zmeneny zdrojak
matica.c#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_ROWS 100
#define MAX_COLS 100
#define MAX_LINE_LENGTH 256
int main()
{
FILE *fp;
char file_name[MAX_LINE_LENGTH] = "matrix.dat";
char data_line[MAX_LINE_LENGTH];
char *matrix_element;
int i, j, max_i, max_j;
int matrix[MAX_ROWS][MAX_COLS] = { 0 };
if (!(fp = fopen(file_name,"r"))) {
printf("ERROR: file \"%s\" not found !\n", file_name);
return 1;
}
printf("Reading data from the file \"%s\":\n\n", file_name);
max_j = 0;
i = 0;
while (fgets(data_line, MAX_LINE_LENGTH, fp) != NULL) {
// Remove trailing \n
data_line[strcspn(data_line, "\n")] = 0;
// split line into matrix elements
matrix_element = strtok(data_line, ",;\t ");
j = 0;
while(matrix_element != NULL) {
printf("%s ", matrix_element);
// populate matrix
if ((i < MAX_ROWS) && (j < MAX_COLS)) {
matrix[i][j] = atoi(matrix_element);
}
j++;
matrix_element = strtok(NULL, ",;\t ");
}
if (max_j < j) max_j = j;
printf("\n");
i++;
}
max_i = i;
fclose(fp);
printf("\n..Done.\n\n");
printf("Data file contains %d rows and %d columns\n\n", max_i, max_j);
// eventually, adapt maximum indexes to the size of the matrix
if (max_i > MAX_ROWS) {
printf("WARNING: due to the declared size, matrix can only store\n"
" %d rows of a total of %d rows from the file.\n\n",
MAX_ROWS, max_i);
max_i = MAX_ROWS;
}
if (max_j > MAX_COLS) {
printf("WARNING: due to the declared size, matrix can only store\n"
" %d columns of a total of %d columns from the file.\n\n",
MAX_COLS, max_j);
max_j = MAX_COLS;
}
// now print the matrix
printf("The matrix is:\n\n");
for (i = 0; i < max_i; i++) {
for (j = 0; j < max_j; j++) {
printf("%d\t", matrix[i][j]);
}
printf("\n");
}
return 0;
}