Czytanie macierzy z pliku

0

Witam. Mam dwa pliki *.txt z których muszę wczytać dwie macierze, każdą do osobnej tablicy. Ma to być w zwykłym C. W plikach macierze mają format np.
4 5 6 7 8 (enter)
3 0 0 9 (enter)
3 1 5 6
Wymiary macierzy są przykładowe, program ma działać na każdy wymiar macierzy np. 2x4 5x8 100x100.
Napiszę co wiem sam i może ktoś z Was mnie nakieruje lub poda konkretną instrukcję która za to odpowiada.

  1. Na początek muszę zrobić dynamiczną alokację pamięci. Wiem, że do tego jest funkcja malloc. Jednak patrząć na składnie nie wiem jak jej użyć. Czy mogę w ten sposób ?
 
 tablica[i] = malloc(wartosc * sizeof **tablica);

Rozumiem, że trzeba tak zadeklarować każdy podwymiar tablicy bo musi to by tablica wielowymiarowa?
2.Instrukcję czytania danych z pliku łatwo znaleźć, ale program wczyta dokładnie ciąg znaków np. 4 5 7 8
a) jak zrobić, aby program nie czytał spacji tylko każdą cyfrę od razu zapisał jako element tablicy dla danego wymiaru ?
b) podobnie ze znakiem enter. Nie wiem jak zrobić aby program wykrył enter i to co jest w nowej linijce przypisał do kolejnego wymiaru tablicy.

Z góry dziękuję za pomoc.

2
  1. Jest ok (ale mało to czytelne dla mnie, poza tym nie musisz robić n alokacji, macierz możesz trzymać w tablicy jednowymiarowej)
  2. fgets do wczytywania linii, sscanf do parsowania. Jak rozmiarów nie znasz to inaczej jest ciężko.

Trochę bez sensu, że nie masz podanych wymiarów na początku pliku. (chyba, że tak jak @_13th_Dragon pisze, pierwsza liczba definiuje szerokość macierzy).

1

Czy ta pierwsza 4 oznacza rozmiar macierzy?

0
_13th_Dragon napisał(a):

Czy ta pierwsza 4 oznacza rozmiar macierzy?

Przepraszam, nie sprecyzowałem tego. Ta pierwsza 4 nie jest rozmiarem macierzy.
Zanim zeskanuje z pliku macierz, program zapyta się mnie o jej wymiary. I podam dokładnie takie jakie znajdują się w pliku txt

1

A co to za macierz co ma różne długości wierszy? Musiałem bardzo słabo uważać na studiach, bo nie słyszałem o takiej.

0
kq napisał(a):

A co to za macierz co ma różne długości wierszy? Musiałem bardzo słabo uważać na studiach, bo nie słyszałem o takiej.

Wiersze mają równą długość. Chodziło mi o kolumny :p

0

Sprawdź wielkość pliku, zaalokuj tyle pamięci ile waży+ilość_pointerów na nowe linie, i potem przypisujesz do pierwszych intów wartość początku stringa tworząc listę, a znaki nowej linii zmieniasz na null bajty '\0'. I potem możesz sobie iterować.

Chyba, że masz to binarnie zapisane liczbą. W sumie wszystko i tak ty musisz zrobić.

0

Program już odczytuje zawartość pliku i zlicza ilość kolumn i wierszy. Pojawił sie problem, gdy chce wprowadzić pojedynczy znak do tablicy wielowymiarowej. Pojawia się komunikat: uninitialized local variable 'tab1'used. I nie mam pojecie co robię źle,
Na początku programu tab1 zadeklarowałem tak:

 
int **tab1;
int tab1_kolumny = 0, tab1_wiersze = 0, tab2_kolumny = 0, tab2_wiersze = 0;

Natomiast kod, gdzie pojawia się błąd wygląda tak:

 
        char x;
        int i;
	int j;
	macierz_a = fopen("macierz_a.txt", "r"); 
	while (feof(macierz_a) == 0)
	{
		x = fgetc(macierz_a);


		for (i = 0; i < (tab1_wiersze); i++)
		{
			for (j = 0; j < (tab1_kolumny); j++)
			{
			tab1[i][j] = x;   //w tym miejscu jest błąd

			}
		}
	}
	fclose(macierz_a);

Ktoś pomoże ?

1

Definiujesz wskaźnik tab1, a nigdzie nie pokazujesz, abyś alokował mu pamięć. Nie lepiej użyć jakiegoś kontenera z biblioteki standardowej, np. std::vector?

Aha, formatuj kod, bo o ile to co wkleiłeś idzie czytać to widać, że masz zadatki na losową indentację.

0

Pamięć przydzieliłem wcześniej:
tab1 = (int**)malloc(tab1_kolumny * tab1_wiersze * sizeof(int));

1

i dla każdego rzędu też przydzieliłeś? Wydaje mi się, że nie rozumiesz jak działają wskaźniki.

0

Dzięki mistrzu, już zadziałało.

0

Program powoli śmiga, ale tym razem mam problem z napisaniem funkcji. Moja tablica wielowymiarowa jest zadeklarowana tak
int **tab1;
Lokalizacja pliku z macierzą wygląda tak:

FILE *macierz_a = NULL;
 macierz_a = fopen("macierz_a.txt", "r"); 

Linijka w której przypisuje do tablicy element, który pobieram z pliku tekstowego wygląda tak:
tab1[i][j] = my_number;
Oczywiście "i" oraz "j" odpowiednio zwiększam po każdym przejściu.

I wszystko mam w programie "na sztywno". Chcę napisać do tego jedną funkcję, do której podaje 2 parametry. Pierwszy jest nazwą pliku tekstowego z macierzą, natomiast drugi jest nazwą tablicy. Czyli wywołanie mojej funkcji chcę aby wyglądało tak:


int main()
{
macierz_1(nazwa_pliku.txt, tablica_pierwsza);
return 0;
}
 

Nie mam pojęcia jak to zrobić. W Internecie znalazłem miliard przykładów z użyciem funkcji. Wszystkie to właściwie przykłady arytmetyczne, gdzie funkcja coś liczy. Moja natomiast ma być tekstową i zmieniać tylko nazwy.

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