niepoprawne działanie fgetc

0
 int main ( int argc, char **argv)
{
		int tab[20][20];
		int c;
		int wiersz=0;
		int kolumna=0;
		FILE *in=fopen("tekst.txt","r");
			
		while( (c=fgetc(in)) !=EOF )
		{
			if(c=='\n')
				wiersz++;
				
			tab[wiersz][kolumna]=c;
				kolumna++;
		}
	
		int i,j;
		for(i=0;i<wiersz;i++)
			for(j=0;j<kolumna;j++)
				printf("%c", tab[i][j]);
				
}

po uruchomieniu programu na konsoli wyskakują jakieś przeróżne i dziwne rzeczy. ktoś mi powie co mam źle? albo najlepiej niech nakieruje o czym mam poczytać jeśli chcę zapakować napis (ileś wierszy i ileś znaków w każdym wierszu) do tablicy dwuwymiarowej. próbowałem scanfu, fgets, fgetc i żadne nie zadziałało skutecznie

plik tekstowy i wynik konsoli: http://www.tinypic.pl/05h4jpqv2jxn

1

Twój błąd polega na tym, że przekraczasz pewnie tablice a w zasadzie inkrementując kolumna++; nawet, jeśli przechodzisz do nowego wiersza.
Czyli wyobraź sobie, że przeczytałeś pierwsze 20 znaków, trafiłeś na znak '\n', przechodzisz do następnego wiersza i zaczynasz od 21 elementu w tablicy czyli tablica[1][21]..

http://pastebin.com/nP6x63Zi

ten program działa, ale jedynie z poprawymi danymi w pliku, możesz sobie przerobić tak, żeby wykrywało przekroczenie tablicy.

1

Może spróbuj to sobie debugować? Sprawdzać krok po kroku jakie wartości masz w zmiennej c.
A na pierwszy rzut oka- masz zmienną kolumna, która Ci wychodzi mocno poza zakres tablicy. Na start ma wartość 0 ale potem z każdym przeczytanym znakiem się inkrementuje. Więc wchodząc do końcowej pętli for(j=0;j<kolumna;j++) to będzie mieć wartość ilości znaków- analogicznie przypisujesz tab[wiersz][kolumna] = c i wychodzisz poza zakres bo tablica jest 20 na 20. Musiałbyś po pierwsze- tablicę na początku wyzerować, potem poprawić while'a tak żeby po napotkaniu nowej linii było wiersz++; oraz kolumna = 0; a w for'ze wypisującym dać warunek if(tab[i][j]) printf(...)- wtedy jeżeli masz znak o kodzie zero w tab[i][j] to Ci nie wypisze nic.

P.S. Debugowanie to podstawa!

2
  1. Zapoznaj się z inkrementacją, bo nie rozumiesz: http://4programmers.net/Forum/1101404
  2. Nie używaj polskiego nazewnictwa: http://4programmers.net/Forum/1208091
  3. Dla przechowywania znaków potrzebna jest tablica znaków (nie int'ów)
  4. Po przejsciu do kolejnego wiersza należałoby wyzerować kolumnę.
  5. Zmienna kolumna jest inna dla każdego wiersza więc użycie rozmiaru ostatniej kolumny do wyświetlenie pozostałych to jakieś nieporozumienie
  6. Zawsze warto sprawdzić czy udało się wczytać plik.
  7. Wpisujesz znak '\n' na początek każdego wiersz, przyjęto wpisywać raczej na konie poprzedniego.
  8. W sumie powinno to wyglądać mniej więcej tak:
#include <stdio.h>

int main(void)
  {
   char tab[30][50];
   int ch,y,x,rows=0,cols=0;
   FILE *in=fopen("nic.c","r");
   if(in)
     {
      while((ch=fgetc(in))!=EOF)
        {
         tab[rows][cols++]=ch;
         if(ch=='\n')
           {
            tab[rows++][cols]=0;
            cols=0;
           }
        }
      for(y=0;y<rows;++y) printf("%s",tab[y]);
      fclose(in);
     }
   else printf("Plik nie udalo sie otworzyc.\n");
   return 0;
  }

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