[c]Wczytywanie z pliku

Draqun

Użytkownik
Dołączył
Sierpień 27, 2007
Posty
67
Panowie a jak zwykle miewam problem:confused:. Chodzi mi o wczytywanie z pliku do tablicy znak po znaku są to różnego rodzaju znaki ASCII począwszy od myślników, poprzez # aż do znaków białych :). Niestety poniższa funkcja wczytuje mi pierwsze 90 i koniec. Nie bardzo wiem jak sobie z tym poradzić. Moje umiejętności są zbyt niskie.

Kod:
char** rysowanie()
{
	int a;
	a=0;
	unsigned int wiersz, kolumna;
	FILE*plik;
	plik=fopen("labirynt.txt","r");
	char** plansza;
	plansza=(char**)malloc(sizeof(char*)*17);
	for(a;a<17;a++)
		{
		plansza[a]=(char*)malloc(sizeof(char)*90);
		}
	
	if(plik==NULL)
		{return NULL;}
	while(!feof(plik))
	{
		for(wiersz=0;wiersz<17;wiersz++) 
		{
			for(kolumna=0; kolumna<90; kolumna++) 
			{
				fgets(&plansza[wiersz][kolumna], 2, plik);
			
			}
		}
	}
	stangry(plansza);

	return plansza;
}

EDYTKA

Znalazłem jeden bład w deklaraci fgets jednak dalej nie wiem dlaczego wczytuje mi tylko pierwsze 90 a potem już nic nie robi :( tzn wczytuje tylko do 1 wiersza a pomija kolenych 16 tak jakby nie istniały.
 
Ostatnia edycja:

g3t_d0wn

Użytkownik
Dołączył
Styczeń 9, 2010
Posty
13
witam, jest tu mój pierwszy post na tym forum, mam nadzieje że pomógł :).
Oto przykład kodu którego na szybko napisałem, komentarze powinny pomóc:

Kod:
#include <stdio.h>

int main( void ) {
    // otwieramy plik z ktorego zamierzamy odczytywac
    FILE* file;
    file = fopen( "file.txt", "r" );
    
    // sprawdzamy czy funkcja nie zwrocila bledu
    if( file == NULL ) {
        puts( "otwieranie pliku[ERROR]\r\n" );
        return 0;
    }
    
    // odczytujemy dane z pliku znak po znaku
    int chr;
    while( chr != -1 ) {
        chr = fgetc( file );
        printf( "%c", chr );
    }
    
    // zamykamy uchwyt do pliku
    fclose( file );
    
    // Amen ;]
    getchar();
}

pozdrawiam
g3t_d0wn
 

RobertG

Użytkownik
Dołączył
Styczeń 3, 2007
Posty
391
Ja się przyczepię do szczegółu, otóż, gdy nie uda się otworzyć pliku, to program nie powinien kończyć się ze statusem 0, bo zwraca się go wtedy, gdy program zakończył się poprawnie. Mogło by tu być np 1 zamiast tego 0, jeszcze lepiej jest wykorzystać z stdlib.h makra, które do tego służą:
Kod:
#include <stdlib.h>                                                             
                                                                                
int main(){                                                                     
    return EXIT_FAILURE;                                                        
    return EXIT_SUCCESS;                                                                                                                                        
}
 
Ostatnia edycja:

g3t_d0wn

Użytkownik
Dołączył
Styczeń 9, 2010
Posty
13
nie widzę sensu w twoim poście i przyczepiania się do natury pisania programów przez programistę. Jak dla mnie to bez sensu w ogóle to pisałeś ...
 

RobertG

Użytkownik
Dołączył
Styczeń 3, 2007
Posty
391
Nie pojechałem po nikim, tylko zwróciłem uwagę na coś, co mogło by być napisane lepiej. Rozwiązanie do którego się czepiłem jest niepoprawne) zwracanie 0, gdy program się zakończy z błędem) i nie ma nic do stylu.

To, że pokazując komuś kod słyszy się uwagi nie jest niczym złym ani niecodziennym.
 

Draqun

Użytkownik
Dołączył
Sierpień 27, 2007
Posty
67
Ale chodzi mi o konkretny błąd w moim kodzie. Ponieważ wczytuje plik do tablicy. Każdy znak ma być w osobnej komórce. Problem jest taki, że wczytuje mi do pierwszego wiersza a do reszty nie. Tak jakby gubiło adresy w pamięci i nie mogło się do nich dostać. Wugląda to tak jakby fragment
Kod:
	while(!feof(plik))
	{
		for(wiersz=0;wiersz<17;wiersz++) 
		{
			for(kolumna=0; kolumna<90; kolumna++) 
			{
				fgets(&plansza[wiersz][kolumna], 2, plik);
			
			}
		}
	}
wiersz - odpowiada za przetrzymywanie adresu wiersza a kolumna za komórki w wierszu - problem jest taki, że wczyta mi do pierwszego wiersza :) ale nie zrobie tego dla następnych :(
 

Draqun

Użytkownik
Dołączył
Sierpień 27, 2007
Posty
67
Ale cały kod uległ zmianie :) i teraz tablica nie jest globalna a siedzi w RAMie i nie chce mi funkcja umieszczac tego co wczytuje w innych wierszach jak w pierwszym :(
 

RobertG

Użytkownik
Dołączył
Styczeń 3, 2007
Posty
391
Kod:
#include <stdio.h>
#include <stdlib.h>


char** rysowanie()
{
    int a;
    a=0;
    unsigned int wiersz, kolumna;
    FILE*plik;
    plik=fopen("labirynt.txt","r");
    char** plansza;
    plansza=(char**)malloc(sizeof(char*)*17);
    for(a;a<17;a++) {
        plansza[a]=(char*)malloc(sizeof(char)*90);
    }
    
    if(plik==NULL) {
        return NULL;
    }

    for(wiersz=0;wiersz<17;wiersz++) 
    {
        for(kolumna=0; kolumna<90; kolumna++) 
        {
            int r = fscanf(plik, "%c", &plansza[wiersz][kolumna]);
            if(EOF == r) { /* mozna dodac wiecej warunkow dla r */
                return 1;
            }
        }
        fscanf(plik, "\n");
    }



  

    return plansza;
}


int main(){
    char** plansza = rysowanie();

    unsigned int wiersz, kolumna;
    for(wiersz=0;wiersz<17;wiersz++)
    {
        for(kolumna=0;kolumna<90;kolumna++) 
        {
            printf("%c", plansza[wiersz][kolumna]); 
        }
        printf("\n");
    }


   
}

Sprawdziłem to tak, jak opisałem w tamtym wątku i nadal działa :)
 

Draqun

Użytkownik
Dołączył
Sierpień 27, 2007
Posty
67
Nie wiem już czy ja jestem głupi czy co? Jeśli poniższy kod działa poprawnie więc czemu dalej program nie działa 0.o? http://draqun.republika.pl/Projekt2.rar - zamieszczam link do programu. Jesli moglibyście wskazać błąd bylbym naprawde wdzięczny. Aha. Program tworzony jest na linuksie z makefilem więc na windzie trzeba będzie poincludować troszke :)
 

RobertG

Użytkownik
Dołączył
Styczeń 3, 2007
Posty
391
Zobacz na funkcję

Kod:
oid stangry(char **plansza)
{
    unsigned int a,b;
    a=b=0;
    system("clear");
    printf("Labirynt\n________________________________________\nSterowanie Lewo: a Prawo: d Gora: w Dol: s Podnies: q Otworz: e\n");
                    
    for(a;a<17;a++)
        {
        for(b;b<90;b++)
            {
            printf("%c", plansza[a][b]);
            }
        }
}
zmienną b powinieneś ustawiać na zero za każdym razem by po kolei wyświetlały się elementy tablicy, po poprawieniu na:

Kod:
void stangry(char **plansza)                                                                                                                                              
{                                                                                                                                                                         
    unsigned int a,b;                                                                                                                                                     
    a=b=0;                                                                                                                                                                
    system("clear");                                                                                                                                                      
    printf("Labirynt\n________________________________________\nSterowanie Lewo: a Prawo: d Gora: w Dol: s Podnies: q Otworz: e\n");                                      
                                                                                                                                                                          
                                                                                                                                                                          
    for(a=0;a<17;a++)                                                                                                                                                     
        {                                                                                                                                                                 
        for(b=0;b<90;b++)                                                                                                                                                 
            {                                                                                                                                                             
            printf("%c", plansza[a][b]);                                                                                                                                  
            }                                                                                                                                                             
        }                                                                                                                                                                 
                                                                                                                                                                          
                                                                                                                                                                          
}
labirynt się wyświetla:

Kod:
Labirynt
________________________________________
Sterowanie Lewo: a Prawo: d Gora: w Dol: s Podnies: q Otworz: e
|=======================================================================================|
|                       |                        |                                      |
|0----------------------(------------------------{-------------------------------------$|
|================-------|========================|========-----=========================|
                |-------|========================|       |-----|                        |
                |-------|                        |$------>-----{-----------------------*|
                |-------{-----------------------*|=======|-----|========================|
|===============|-------|========================|       |-----|                        |
|               |-------|                        |*------}-----{-----------------------*|
|#--------------)-------<-----------------------#|=======|-----|========================|
|===============|-------|========================|       |-----|                        |
                |-------|                        |------->-----<-----------------------$|
                |-------|i-----------------------}-------|-----|-----------------------$|
|===============|===-===|========================|=======|-----|========================|
|------------------------------------------------|       |-----|                        |
|$--$--$-------------------------------$--$--$--$|$------}-----{------------------------[
|================================================|=======|=====|========================|
 

Draqun

Użytkownik
Dołączył
Sierpień 27, 2007
Posty
67
Ależ ja durny. A tyle razy miałem to przed oczyma. Ok jeśli możesz jeszcze spojrzeć na funkcję poruszanie. gdb wskazuje mi na fragment "plansza[a+ruch1][b+ruch2]='0';" - odpowiedzialny za podmianę zawartości komórki na owe zero. Dostaje tam komunikat Segmentation fault.

I wielkie ale to wielkie dzięki za dotychczasową pomoc :)
 
Ostatnia edycja:

Draqun

Użytkownik
Dołączył
Sierpień 27, 2007
Posty
67
Przyczyny odnalezione :) Czasem :) niejednokrotnie głupie błędy. Natomiast najważniejszy był spowodowany brakiem doświadczenia - zwyczajnie nie wiedziałem, że jeszcze muszę pewnej strukturze przydzielić pamięć :).

W każdym razie szczerze dziękuje wszytkim, którzy pomagali mi :)
 
Do góry Bottom