niepoprawne działanie fgetc

niepoprawne działanie fgetc
R1
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:12
0
Kopiuj
 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.

LU
  • Rejestracja:około 9 lat
  • Ostatnio:około 9 lat
  • Postów:11
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!

edytowany 1x, ostatnio: lukasson
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
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:
Kopiuj
#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;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
R1
jedno małe pytanie. jeśli "ch" jest nową linią to później przechodzimy do warunku i po co stawiamy zero za znakiem nowej linii w tym samym jeszcze wersie ? bo tab[rows++][cols]=0 znaczy, że najpierw przypiszemy '0' do jeszcze poprzedniego wersu, a dopiero później zwiększamy wartość "rows"
R1
zatem po co nam "0" za znakiem nowej linii ?
_13th_Dragon
Znak końca wiersza.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.