Witam,
próbowałem zrobić lekką modyfikację kodu znajdującego się u góry
jednak napotkałem pewien problem
tworzona na podstawie danych w pliku tekstowego tablica wyświetla same 0.000 a chciałbym żeby przetrzymywała wartości z tablicy mat bo chciałbym wykonywać na niej później modyfikacje
dodam że próbowałem przepisywać elementy z tablicy mat do Matrix ale nie za bardzo działa
może jakieś sugestie
Pozdrawiam
PS. przykładowe dane do pliku tekstowego "dane.txt" który trzeba utworzyć
macierz bazowa i prawe strony równania do metody bazowej
2 3 1 0 0 18
4 1 0 1 0 16
2 1 0 0 -1 2
Kod: Zaznacz cały
#include <stdio.h>
#include <stdlib.h>
void wczytywanie_danych(void);
long otworz_plik(FILE** File);
void pobierz_rozmiar(FILE* File,int* Width,int* Height);
int stworz_macierz(int*** Matrix,int Width,int Height);
float wczytaj_macierz(FILE* File,int*** Matrix,int Width,int Height);
void pokaz_macierz(int** Matrix,int Width,int Height);
void usun_macierz(int*** Matrix,int Width);
int main()
{
FILE* plik=NULL;
long dlugosc_pliku=0;
int** Matrix=NULL;
int Width=0;
int Height=0;
otworz_plik(&plik);
pobierz_rozmiar(plik,&Width,&Height);
stworz_macierz(&Matrix,Width,Height);
wczytaj_macierz(plik,&Matrix,Width,Height);
pokaz_macierz(Matrix,Width,Height);
// usun_macierz(&Matrix,Width);
fclose(plik);
return 0;
}
long otworz_plik(FILE** plik){
char nazwa_pliku_do_otwarcia[30] = {0};
long dlugosc_pliku = 0;
*plik = NULL;
printf("PODAJ NAZWE PLIKU Z DANYMI: ");
scanf("%29s",nazwa_pliku_do_otwarcia);
*plik = fopen(nazwa_pliku_do_otwarcia, "rt");
if(!(*plik)) {
printf("NIE MOZNA OTWORZYC PLIKU %s.",nazwa_pliku_do_otwarcia);
return -1;
}
fseek(*plik,0,SEEK_END);
dlugosc_pliku=ftell(*plik);
fseek(*plik,0,SEEK_SET);
return dlugosc_pliku;
}
void pobierz_rozmiar(FILE* plik, int* Width,int* Height){
int symbol = 0,
columns = 0,
rows = 0;
if (plik != NULL){
do{
symbol = fgetc(plik);
if (rows == 0 && (isspace(symbol) || feof(plik))){
columns++;
}
if (symbol == '\n' || feof(plik)){
rows++;
}
}
while (symbol != EOF);
if (ferror(plik)){
printf("BRAD ODCZYTU PLIKU.\n");
}
else{
printf("PLIK ZAWIERA %d WIERSZY %d KOLUMN.\n", rows, columns);
}
}
else{
perror("BLAD OTWARCIA PLIKU");
}
*Width = columns;
*Height = rows;
}
int stworz_macierz(int*** Matrix,int Width,int Height)
{
int i=0;
*Matrix=(int**) malloc(Width*sizeof(int*));
if(!(*Matrix))
{
printf("Blad allokacji pamieci.");
return -1;
}
for(i=0;i<Width;++i)
(*Matrix)[i]=NULL;
for(i=0;i<Width;++i)
(*Matrix)[i]=(int*) malloc(Height*sizeof(int));
for(i=0;i<Width;++i)
if((*Matrix)[i]==NULL)
return -1;
return 0;
}
float wczytaj_macierz(FILE *plik, int*** Matrix,int Width,int Height){
int rows = Height;
int cols = Width;
char *buffer;
int ret,row=0,i,j;
char *result=NULL;
char delims[]=" \t";
float **mat = malloc( rows*sizeof(float*));
for(i = 0; i < rows; i++)
mat[i] = malloc( cols*sizeof(float));
if ((plik = fopen("dane.txt", "r")) == NULL){
fprintf(stdout, "Error: Can't open file !\n");
}
while(!feof(plik)){
buffer = malloc(sizeof(char) * 4096);
memset(buffer, 0, 4096);
ret = fscanf(plik, "%4095[^\n]\n", buffer);
if (ret != EOF) {
int field = 0;
result = strtok(buffer,delims);
while(result!=NULL){
if(field>10 )break;
mat[row][field]=atof(result);
result=strtok(NULL,delims);
field++;
}
++row;
}
free(buffer);
}
//fclose(plik);
i = 0;
j = 0;
for(i=0;i<rows;i++){
for(j=0;j<cols;j++)
printf("%.3f%s",mat[i][j], j < cols-1 ? "\t" : "\n");
free(mat[i]);
}
free(mat);
}
void pokaz_macierz(int** Matrix,int Width,int Height)
{
int i=0;
int j=0;
printf("\n\n");
for(i=0;i<Height;i++){
for(j=0;j<Width;j++)
printf("%.3f%s",Matrix[i][j], j < Width-1 ? "\t" : "\n");
free(Matrix[i]);
}
free(Matrix);
}
void usun_macierz(int*** Matrix,int Width)
{
int i=0;
if(!*Matrix)
return;
if(Width<0)
return;
for(i=0;i<Width;++i)
free((*Matrix)[i]);
free(*Matrix);
}