Problem z wczytywaniem tablicy 2D z pliku.

0

Cześć, mam problem z tą funkcją. Ma ona wczytywać dwie tablice 2D z pliku i o ile pętla wczytująca drugą tablicę działa bez zarzutu to pierwsza przestawia kolejnosc wczytywanych liczb. Debugger nie pomaga. Z góry dziękuję za pomoc.

int odczyt_z_pliku(int tab_a[wiersze][kolumny],int tab_b[wiersze][kolumny],unsigned wiersze, unsigned kolumny)
{
	int odczyt_z_pliku=0;	
	FILE *fp;
	fp=fopen("calc.txt","r");
	if (fp==NULL){fprintf(stderr,"Nie mozna otworzyc pliku\n");exit(1);}	
	else for(w=0;w<wiersze;w++)
		{
			for(k=0;k<kolumny;k++)
			{
				fscanf(fp,"%d",&tab_a[w][k]);	
			}	
			
		}		
		for(w=0;w<wiersze;w++)
		{
			for(k=0;k<kolumny;k++)
			{
				fscanf(fp,"%d",&tab_b[w][k]);	
			}
		}
		
fclose(fp);
return odczyt_z_pliku;
}
```C
0

Sformatuj ładnie kod:

int odczyt_z_pliku(int tab_a[wiersze][kolumny], int tab_b[wiersze][kolumny], unsigned wiersze, unsigned kolumny)
{
	int odczyt_z_pliku = 0;
	FILE *fp;
	fp = fopen("calc.txt", "r");
	if (fp == NULL) 
	{ 
		fprintf(stderr, "Nie mozna otworzyc pliku\n"); 
		exit(1); 
	}
	
	for (w = 0; w<wiersze; w++)
	{
		for (k = 0; k<kolumny; k++)
		{
			fscanf(fp, "%d", &tab_a[w][k]);
		}

	}
	for (w = 0; w<wiersze; w++)
	{
		for (k = 0; k<kolumny; k++)
		{
			fscanf(fp, "%d", &tab_b[w][k]);
		}
	}

	fclose(fp);
	return odczyt_z_pliku;
}

Czy tab_a == tab_b? Bo jeżeli tak to wypadałoby wrzucić to do jednej pętli:

for (w = 0; w<wiersze; w++)
{
	for (k = 0; k<kolumny; k++)
	{
		int val;
		fscanf(fp, "%d", &val);
		tab_a[w][k] = val;
		tab_b[w][k] = val;
	}
}

Teraz to nie działa bo najprawdopodobniej wczytujesz cały plik do tab_a a potem próbujesz czytać coś do tab_b tylko problem jest taki że plik się już skończył.

Gdzie masz zdefiniowane w i k?

0

To tylko jedna funkcja z całego programu, więc w i k mam najwyraźniej zdefiniowane gdzieś indziej. tab_a=/tab_b i plik się raczej nie skonczył, bo wygląda mniej wiecej tak:
"1 2 3
4 5 6
7 8 9

9 8 7
6 5 4
3 2 1"
Cel tej funckji to wczytanie pierwszej macierzy 3x3 do tab_a i drugiej do tab_b. Jednak jak to odpalam to wczytuje się mniej tak:
5 4 3
2 1 6
7 8 9

9 8 7
6 5 4
3 2 1
I nie mam pojecia dlaczego funkcja najpierw wczytuje 5 liczb z tej drugiej macierzy a potem jak gdyby nigdy nic wraca sobie i leci juz normalnie.

0

A jakby najpierw czytać cały plik do jakiegoś bufora, a potem wyodrębniać liczby?

0
PanRiK napisał(a):

A jakby najpierw czytać cały plik do jakiegoś bufora, a potem wyodrębniać liczby?

Hmm to leży poza zakresem mojej wiedzy i umiejętności.

Udało mi się ustalić ze pętle wczytują dobrze liczby i na dobre indeksy ale jak już po skończeniu pętli chcę się odwołać do miejsca w tabeli na danych indeksach to już zawartością jest zupełnie inna liczba.

0

Buffor to tablica charów,a zczytywanie odbywało by się w pętli dopóki nie skończył by się plik.

Pokaż jak wyświetlasz te tablice :).

0

U mnie poniższy kod działa bez problemu:

#include <stdio.h>

#define SUCCESS 0
#define ERROR 1

int read(int rows, int columns, int tab_a[rows][columns], int tab_b[rows][columns])
{
    FILE *file = fopen("test.txt", "r");
    if(file == NULL)
    {
        return ERROR;
    }

    for(int i = 0; i < rows; i++)
    {
        for(int j = 0; j < columns; j++)
        {
            fscanf(file, "%d", &tab_a[i][j]);
        }
    }
    for (int i = 0; i < rows; i++)
    {
        for(int j = 0; j < columns; j++)
        {
            fscanf(file, "%d", &tab_b[i][j]);
        }
    }

    fclose(file);
    return SUCCESS;
}

int main(int argc, char *argv[])
{
    int tab_a[3][3];
    int tab_b[3][3];

    read(3,3,tab_a, tab_b);

    for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            printf("%d ", tab_a[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            printf("%d ", tab_b[i][j]);
        }
        printf("\n");
    }
}

Dużo się nie różni oprócz kolejności parametrów, gdy mam tak jak ty to IDE mi płacze że wiersze i kolumne jest niezdefiniowane.

0

Ja mam zdefiniowane globalnie więc pewnie jak wkleilem tylko kod jednej funkcji to nie bylo widać.

Czy to że mi nie działa może wynikać z tego ze użyłem tablic VLA?

0
PanRiK napisał(a):

Buffor to tablica charów,a zczytywanie odbywało by się w pętli dopóki nie skończył by się plik.

Pokaż jak wyświetlasz te tablice :).

Tablice wyświetlam na 2 sposoby: pierwszy to w tym samym kodzie wrzucilem printf pod fscanf a drugi to po prostu funkcja :(pierwszy sposób wyświetla wszystko prawidłowo ale ten drugi już źle)

int wypisanie(int tab[wiersze][kolumny], unsigned wiersze,unsigned kolumny)
{
	for(w=0;w<wiersze;w++)
		{
			for(k=0;k<kolumny;k++)
				{
					printf(" %d",tab[w][k]);
				}printf("\n");
		}
}
0

VLA nie powoduje żadnego problemu, gdyby kompilator nie obsługiwał to by napisał że coś jest nie tak.
Pętle u mnie wyglądają tak samo, więc problem też nie jest z wypisywaniem.

Dlaczego w i k są zdefiniowane globalnie?
Wklej tu cały kod, może błąd jest gdzieś indziej.

0

Tak na teraz wygląda cały kod. Jest jeszcze nie dokończony i cos tam na bieżąco przerabiałem ale cały czas jest ten problem. Program ma wykonywać dodawanie odejmowanie i mnożenie macierzy. Większość printfów jest kontrolnych i na koniec je usune.

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

int w;
int k;
int i,j;	
unsigned wiersze,kolumny;

	
int pobranie_i_zapis_A(int tab[wiersze][kolumny],unsigned wiersze,unsigned kolumny)
{	
	printf("Macierz A=\n");	
	for(w=0;w<wiersze;w++)
		{		
			for(k=0;k<kolumny;k++)
				{
					scanf("%d",&tab[w][k]);
				}	
		}
	FILE *fp;
	fp=fopen("calc.txt","w");
	if (fp==NULL)fprintf(stderr,"Nie mozna otworzyc pliku\n");	
	for(w=0;w<wiersze;w++)
		{
			for(k=0;k<kolumny;k++)
				{
					fprintf(fp," %d",tab[w][k]);
				}
			fprintf(fp,"\n");		
		}
fclose(fp);
}
//-------------------------------------------------------------------------------
int wypisanie(int tab[wiersze][kolumny], unsigned wiersze,unsigned kolumny)
{
printf("macierz a:\n");
	for(w=0;w<wiersze;w++)
		{
			for(k=0;k<kolumny;k++)
				{
					printf(" %d",tab[w][k]);
				}printf("\n");
		}
}
//--------------------------------------------------------------------------------
int pobranie_i_zapis_B(int tab[wiersze][kolumny],unsigned wiersze,unsigned kolumny)
{
	printf("Macierz B=\n");	
	for(w=0;w<wiersze;w++)
		{
					
			for(k=0;k<kolumny;k++)
				{
					scanf("%d",&tab[w][k]);
				}	
		}
	FILE *fp;
	fp=fopen("calc.txt","a");
	if (fp==NULL)fprintf(stderr,"Nie mozna otworzyc pliku\n");	
	else for(w=0;w<wiersze;w++)
		{
			fprintf(fp,"\n");			
			for(k=0;k<kolumny;k++)
				{
					fprintf(fp," %d",tab[w][k]);
				}		
		}
fclose(fp);
}
//---------------------------------------------------------------------------------------
/*int odczyt_z_pliku(int tab_a[wiersze][kolumny],int tab_b[wiersze][kolumny],unsigned wiersze, unsigned kolumny)
{
	int odczyt_z_pliku=0;	
	FILE *fp;
	fp=fopen("calc.txt","r+");
	if (fp==NULL){fprintf(stderr,"Nie mozna otworzyc pliku\n");exit(1);}	
	else for(w=0;w<wiersze;w++)
		{
			for(k=0;k<kolumny;k++)fscanf(fp,"%d",&tab_a[w][k]);					
		}		
		for(w=0;w<wiersze;w++)
		{
			for(k=0;k<kolumny;k++)fscanf(fp,"%d",&tab_b[w][k]);
		}
		
fclose(fp);
return odczyt_z_pliku;
}*/
//--------------------------------------------------------------------------------------
int dodawanie(int tab_1[wiersze][kolumny],int tab_2[wiersze][kolumny],unsigned wiersze,unsigned kolumny)
{
	
	FILE *fp;
	fp=fopen("calc.txt","a+");
	if (fp==NULL)fprintf(stderr,"Nie mozna otworzyc pliku\n");
	else
	{
		for(i=0;i<wiersze;i++)
		{
			for(j=0;j<kolumny;j++)
			{
				fscanf(fp,"%d",&tab_1[i][j]);printf(" %da",tab_1[i][j]);
			}printf("\n");					
		}		
		for(i=0;i<wiersze;i++)
		{
			for(j=0;j<kolumny;j++)
			{
				fscanf(fp,"%d",&tab_2[i][j]);printf(" %db",tab_2[i][j]);
			}printf("\n");
		}

printf("\n\n");
	for(i=0;i<wiersze;i++)
		{
			for(j=0;j<kolumny;j++)
				{
					printf(" %d",tab_1[i][j]);
				}printf("\n");
		}printf("\n\n");
printf("\n\n");
	for(i=0;i<wiersze;i++)
		{
			for(j=0;j<kolumny;j++)
				{
					printf(" %d",tab_2[i][j]);
				}printf("\n");
		}printf("\n\n");
		fprintf(fp,"\n"); 
		for(i=0;i<wiersze;i++)
		{	
			fprintf(fp,"\n");		
			for(j=0;j<kolumny;j++)
			{	
				fprintf(fp," %d",tab_1[i][j]+tab_2[i][j]);
				printf(" %d",tab_1[i][j]+tab_2[i][j]);
			}
		printf("\n");
		}
	}
printf("\n");
fclose(fp);	
}
//-----------------------------------------------------------------------------------------
int odejmowanie(int tab_1[wiersze][kolumny],int tab_2[wiersze][kolumny],unsigned wiersze,unsigned kolumny)
{
	FILE *fp;
	fp=fopen("calc.txt","a+");
	if (fp==NULL)fprintf(stderr,"Nie mozna otworzyc pliku\n");
	else
	{
		for(i=0;i<wiersze;i++)
		{
			for(j=0;j<kolumny;j++)
			{
				fscanf(fp,"%d",&tab_1[i][j]);printf(" %da",tab_1[i][j]);
			}printf("\n");					
		}		
		for(i=0;i<wiersze;i++)
		{
			for(j=0;j<kolumny;j++)
			{
				fscanf(fp,"%d",&tab_2[i][j]);printf(" %db",tab_2[i][j]);
			}printf("\n");
		}

printf("\n\n");
	for(i=0;i<wiersze;i++)
		{
			for(j=0;j<kolumny;j++)
				{
					printf(" %d",tab_1[i][j]);
				}printf("\n");
		}printf("\n\n");
printf("\n\n");
	for(i=0;i<wiersze;i++)
		{
			for(j=0;j<kolumny;j++)
				{
					printf(" %d",tab_2[i][j]);
				}printf("\n");
		}printf("\n\n");
		fprintf(fp,"\n"); 
		for(i=0;i<wiersze;i++)
		{	
			fprintf(fp,"\n");		
			for(j=0;j<kolumny;j++)
			{	
				fprintf(fp," %d",tab_1[i][j]-tab_2[i][j]);
				printf(" %d",tab_1[i][j]-tab_2[i][j]);
			}
		printf("\n");
		}
	}
printf("\n");
fclose(fp);	
}
//-----------------------------------------------------------------------------------------
int main()
{	
	char znak;
	printf("Prosze wybrac dzialanie('+','-' lub '*')\n");	
	scanf("%s",&znak);
	int tab_A[wiersze][kolumny],tab_B[wiersze][kolumny];
	int taba[wiersze][kolumny],tabb[wiersze][kolumny];	
	printf("Prosze podac wymiary macierzy:\nWiersze:");
	scanf("%d",&wiersze);
	printf("Kolumny:");
	scanf("%d",&kolumny);
	pobranie_i_zapis_A(tab_A,wiersze,kolumny);
	wypisanie(tab_A,wiersze,kolumny);
	pobranie_i_zapis_B(tab_B,wiersze,kolumny);
	wypisanie(tab_B,wiersze,kolumny);
	
	printf("C=\n");
	//if (znak=='*') mnozenie(tab_A,tab_B,tab_C,wiersze,kolumny;	
	/*else*/ if (znak=='+') dodawanie(taba,tabb,wiersze,kolumny);
	else if (znak=='-') odejmowanie(taba,tabb,wiersze,kolumny);
	else printf("Error\n");		
return 0;
}
1

Problem jest z tym że używasz zmiennych globalnych (serio!). Bez nich taki kod by się nie skompilował:

int odejmowanie(int tab_1[wiersze][kolumny],int tab_2[wiersze][kolumny],unsigned wiersze,unsigned kolumny)

Bo kompilator by pytał "Co to są wiersze? Co to są kolumny?".

W funkcji głównej tworzysz tablice, podajesz wiersze i kolumny jako rozmiary, dopiero potem pobierasz wartości tych zmiennych. I bum, utworzona tablice to 0x0 (bo zmienne globalne automatycznie są inicjalizowane na 0), a potem mówisz funkcji że ma ona np. 3 wiersze i 3 kolumny.

Pozbądź się zmiennych globalnych. Będziesz musiał zmienić kolejność parametrów tak jak ja.

Jeszcze jedno, jeżeli piszesz że funkcja ma zwracać int to czemu go nie zwraca? Robisz ten sam błąd dla większości (jeśli nie każdej) funkcji. Jeżeli nie chcesz nic zwracać to typ funkcji powinien być void.

0

Dzięki wielkie za pomoc pozmieniam i oby zadziałało.

0

Zadziała, po dodawaniu plik wygląda tak:

 1 2 3
 4 5 6
 7 8 9

 9 8 7
 6 5 4
 3 2 1

 10 10 10
 10 10 10
 10 10 10
0

Nie mam farta, dalej mi nie działa...

1

Usunąłeś wszędzie zmienne globalne? Zmieniłeś kolejność w main() czyli najpierw pobierasz ilość kolumn i wierszy a potem dopiero tworzysz tablice?

0

Tak mi się wydaje.

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

	
void pobranie_i_zapis_A(unsigned wiersze,unsigned kolumny, int tab[wiersze][kolumny])
{		
	int w,k;	
	printf("Macierz A=\n");	
	for(w=0;w<wiersze;w++)
		{		
			for(k=0;k<kolumny;k++)
				{
					scanf("%d",&tab[w][k]);
				}	
		}
	FILE *fp;
	fp=fopen("calc.txt","w");
	if (fp==NULL)fprintf(stderr,"Nie mozna otworzyc pliku\n");	
	for(w=0;w<wiersze;w++)
		{
			for(k=0;k<kolumny;k++)
				{
					fprintf(fp,"%d ",tab[w][k]);
				}
			fprintf(fp,"\n");		
		}
fclose(fp);
}
//-------------------------------------------------------------------------------
void wypisanie(unsigned wiersze,unsigned kolumny, int tab[wiersze][kolumny])
{
	int w,k;	
	printf("macierz a:\n");
	for(w=0;w<wiersze;w++)
		{
			for(k=0;k<kolumny;k++)
				{
					printf("%d ",tab[w][k]);
				}printf("\n");
		}
}
//--------------------------------------------------------------------------------
void pobranie_i_zapis_B(unsigned wiersze,unsigned kolumny, int tab[wiersze][kolumny])
{
	int w,k;		
	printf("Macierz B=\n");	
	for(w=0;w<wiersze;w++)
		{
					
			for(k=0;k<kolumny;k++)
				{
					scanf("%d",&tab[w][k]);
				}	
		}
	FILE *fp;
	fp=fopen("calc.txt","a");
	if (fp==NULL)fprintf(stderr,"Nie mozna otworzyc pliku\n");	
	else for(w=0;w<wiersze;w++)
		{
			fprintf(fp,"\n");			
			for(k=0;k<kolumny;k++)
				{
					fprintf(fp,"%d ",tab[w][k]);
				}		
		}
fclose(fp);
}
//---------------------------------------------------------------------------------------
int odczyt_z_pliku(unsigned wiersze, unsigned kolumny,int tab_a[wiersze][kolumny],int tab_b[wiersze][kolumny])
{	
	int odczyt_z_pliku=0;	
	int w,k;		
	FILE *fp;
	fp=fopen("calc.txt","r");
	if (fp==NULL){fprintf(stderr,"Nie mozna otworzyc pliku\n");exit(1);}	
	else for(w=0;w<wiersze;w++)
		{
			for(k=0;k<kolumny;k++)
			{
			fscanf(fp,"%d",&tab_a[w][k]);	
			printf("%d ",tab_a[w][k]);
			}
		}		
		for(w=0;w<wiersze;w++)
		{
			for(k=0;k<kolumny;k++)
			{
				fscanf(fp,"%d",&tab_b[w][k]);
				printf("%d ",tab_b[w][k]);
			}
		}
		
fclose(fp);
return odczyt_z_pliku;
}
//--------------------------------------------------------------------------------------
void dodawanie(unsigned wiersze,unsigned kolumny,int tab_1[wiersze][kolumny],int tab_2[wiersze][kolumny])
{
	
	int w,k;		
	FILE *fp;
	fp=fopen("calc.txt","a");
	if (fp==NULL)fprintf(stderr,"Nie mozna otworzyc pliku\n");
printf("\n\n");
	for(w=0;w<wiersze;w++)
		{
			for(k=0;k<kolumny;k++)
				{
					printf("%d ",tab_1[w][k]);
				}printf("\n");
		}printf("\n\n");
printf("\n\n");
	for(w=0;w<wiersze;w++)
		{
			for(k=0;k<kolumny;k++)
				{
					printf("%d ",tab_2[w][k]);
				}printf("\n");
		}printf("\n\n");
		fprintf(fp,"\n"); 
		for(w=0;w<wiersze;w++)
		{	
			fprintf(fp,"\n");		
			for(k=0;k<kolumny;k++)
			{	
				fprintf(fp,"%d ",tab_1[w][k]+tab_2[w][k]);
				printf("%d ",tab_1[w][k]+tab_2[w][k]);
			}
		printf("\n");
		}
	
printf("\n");
fclose(fp);	
}
//-----------------------------------------------------------------------------------------
void odejmowanie(unsigned wiersze,unsigned kolumny, int tab_1[wiersze][kolumny],int tab_2[wiersze][kolumny])
{
	int w,k;		
	FILE *fp;
	fp=fopen("calc.txt","a");
	if (fp==NULL)fprintf(stderr,"Nie mozna otworzyc pliku\n");
	printf("\n\n");
	for(w=0;w<wiersze;w++)
		{
			for(k=0;k<kolumny;k++)
				{
					printf("%d ",tab_1[w][k]);
				}printf("\n");
		}printf("\n\n");
printf("\n\n");
	for(w=0;w<wiersze;w++)
		{
			for(k=0;k<kolumny;k++)
				{
					printf("%d ",tab_2[w][k]);
				}printf("\n");
		}printf("\n\n");
		fprintf(fp,"\n"); 
		for(w=0;w<wiersze;w++)
		{	
			fprintf(fp,"\n");		
			for(k=0;k<kolumny;k++)
			{	
				fprintf(fp,"%d ",tab_1[w][k]-tab_2[w][k]);
				printf("%d ",tab_1[w][k]-tab_2[w][k]);
			}
		printf("\n");
		}
	
printf("\n");
fclose(fp);	
}
//-----------------------------------------------------------------------------------------
//void mnozenie(tab1[wiersze][kolumny],tab2[wiersze][kolumny]
//-------------------------------------------------------------------------------------------
int main()
{		
	unsigned wiersze,kolumny;
	char znak;
	int tab_A[wiersze][kolumny],tab_B[wiersze][kolumny];
	int tab_a[wiersze][kolumny],tab_b[wiersze][kolumny];	
	printf("Prosze wybrac dzialanie('+','-' lub '*')\n");	
	scanf("%s",&znak);
	//if (znak=='*') mnozenie(taba,tabb,wiersze,kolumny);
	 if (znak=='-'||znak=='+')
	{	
		
		printf("Prosze podac wymiary macierzy:\nWiersze:");
		scanf("%d",&wiersze);
		printf("Kolumny:");
		scanf("%d",&kolumny);
		pobranie_i_zapis_A(wiersze,kolumny,tab_A);
		wypisanie(wiersze,kolumny,tab_A);
		pobranie_i_zapis_B(wiersze,kolumny,tab_B);
		wypisanie(wiersze,kolumny,tab_B);
		odczyt_z_pliku(wiersze,kolumny,tab_a,tab_b);		
		printf("\nC=\n");
	if (znak=='+') dodawanie(wiersze,kolumny,tab_a,tab_b);
	else if (znak=='-') odejmowanie(wiersze,kolumny,tab_a,tab_b);
	else printf("Error\n");	
	}	
return 0;
}
1

Zobacz gdzie masz definicje tablic a gdzie podajesz wartości zmiennych wiersze i kolumny (mówię tylko o samej funkcji main()) - teraz jest odwrotnie, najpierw chcesz utworzyć tablice a dopiero potem powiedzieć jaki mają mieć rozmiar.

Kompiluj z flagami -Wall i -pedantic, będziesz widział więcej błędów.

0

Chyba rozumiem, chodzi o to żeby zadeklarować tablice już po pobraniu rozmiaru przez scanf tak?

Dzięki wielkie już działa.

1

No tak, jak chcesz stworzyć tablicę kiedy nie podasz jej rozmiaru? :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1