Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] Odczytywanie danych za pomocą scanf / fscanf

Ostatnio zmodyfikowano 2013-12-19 20:43
Autor Wiadomość
quatromen
Temat założony przez niniejszego użytkownika
[C] Odczytywanie danych za pomocą scanf / fscanf
» 2013-12-19 00:04:32
Witam

MAm problem z odczytywaniem . Mianowicie kompiluje się ten kod ale jak wpisuje np: kubus.pgm to wyskakuje okno :

test.exe has stopped working

Close the program


a jak wpisze coś innego to nawet nie wyskakują mi komunikaty ze niewłaściwy plik czy nieprawidłowy uchwyt. Co jest zle ?? ?? ??
Proszę sprawdzenie kodu.

C/C++
/*Pawel Szklarz*/
/*209387*/

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

#define MAX 400
#define DL_LINII 200

/* Deklaracja struktury ZROBIONE*/
typedef struct {
    int wymx;
    int wymy;
    int szarosci;
    int * obraz_pgm[ MAX ][ MAX ];
} obraz;

/* Wczytywanie obrazu ZROBIONE */
int czytaj( FILE * p, obraz * wobr )
{
    char s[ DL_LINII ];
    int znak, koniec = 0, i, j;
   
    /*sprawdzenie czy podano prawid³owy uchwyt pliku */
    if( p == NULL ) {
        fprintf( stderr, "Blad: Nie podano uchwytu do pliku\n" );
        return( 0 );
    }
    if( fgets( s, DL_LINII, p ) == NULL ) koniec = 1;
    /* Sprawdzenie "numeru magicznego - powinien byæ P2 */
    if(( s[ 0 ] != 'P' ) ||( s[ 1 ] != '2' ) || koniec ) {
        fprintf( stderr, "Blad: To nie jest plik PGM\n" );
        return( 0 );
    }
    /* Pominiecie komentarzy */
    do {
        if(( znak = fgetc( p ) ) == '#' ) {
            if( fgets( s, DL_LINII, p ) == NULL ) koniec = 1;
           
        } else {
            ungetc( znak, p );
        }
    } while( !koniec && znak == '#' );
   
    /* Pobranie wymiarow obrazu i liczby odcieni szarosci */
    if( fscanf( p, "%d %d %d", wobr->wymx, wobr->wymy, wobr->szarosci ) != 3 ) {
        fprintf( stderr, "Blad: Brak wymiarow obrazu lub liczby stopni szarosci\n" );
        return( 0 );
    }
    /* Pobranie obrazu i zapisanie w tablicy obraz_pgm*/
    for( i = 0; i < wobr->wymy; i++ )
    {
        for( j = 0; j < wobr->wymx; j++ )
        {
            if( fscanf( p, "%d", &( wobr->obraz_pgm[ i ][ j ] ) ) != 1 ) {
                fprintf( stderr, "Blad: Niewlasciwe wymiary obrazu\n" );
                return( 0 );
            }
        }
    }
   
   
}



int main()
{
    FILE * plik;
    char nazwa[ 100 ];
    int odczytano = 1;
   
    obraz obr;
   
    printf( "Podaj nazwe pliku w formacie xxxxx.pgm:\n" );
    scanf( "%s", nazwa );
    plik = fopen( nazwa, "r" );
   
    if( plik != NULL ) /* co spowoduje zakomentowanie tego warunku */
         odczytano = czytaj( plik, & obr );
   
}
P-99631
DejaVu
» 2013-12-19 01:28:07
C/C++
if( fscanf( p, "%d %d %d", wobr->wymx, wobr->wymy, wobr->szarosci ) != 3 ) {
zamień na:
C/C++
if( fscanf( p, "%d %d %d", & wobr->wymx, & wobr->wymy, & wobr->szarosci ) != 3 ) {
P-99632
quatromen
Temat założony przez niniejszego użytkownika
» 2013-12-19 01:41:11
Wielkie dzięki DejVu :)
P-99633
quatromen
Temat założony przez niniejszego użytkownika
» 2013-12-19 01:57:36
Probowalem sam wywnioskwoac dlaczegosa stosowane te ampersantyale coś nie jestem w stanie, dlaczego one tam są ?? ?? ??
P-99634
DejaVu
» 2013-12-19 10:39:54
W języku C nie było czegoś takiego jak przekazywanie wartości zmiennych przez referencję - argument funkcji zawsze przekazywany był jako kopia zmiennej. W związku z powyższym, jedyną drogą modyfikacji danych przekazanych poprzez argument są wskaźniki, dzięki któremu znasz adres pamięci, który chcesz modyfikować. Właśnie dlatego do funkcji scanf przekazuje się wskaźniki na zmienne, które mają zostać zmodyfikowane.
P-99638
quatromen
Temat założony przez niniejszego użytkownika
» 2013-12-19 16:30:29
Chciałbym dodać tablice dynamiczną dwuwymiarową żeby wymiary same się dostosowywały do obrazu a nie żeby rezerwować już wymiar w pamięci
Więc przerobiłem ten program w ten sposób: i problem polega na tym że jak dodaje funkcje negacji tonie działa :(
Prosze o pomoc.


C/C++
/*Pawel Szklarz*/
/*209387*/

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

#define MAX 400
#define DL_LINII 200

/* Deklaracja struktury ZROBIONE*/
typedef struct {
    int wymx;
    int wymy;
    int szarosci;
    void * obraz_pgm;
} obraz;

/* Negacja (zamiana czarnego na biale) ZROBIONE */
void negacja( obraz * wobr )
{
    int i, j;
    for( j = 0; j < wobr->wymx; j++ )
    {
        for( i = 0; i < wobr->wymy; i++ )
        {
            wobr->obraz_pgm[ i ][ j ] =( int * )( int ) wobr->szarosci -( int ) wobr->obraz_pgm[ i ][ j ];
        }
    }
}


/* Wczytywanie obrazu ZROBIONE */
int czytaj( FILE * p, obraz * wobr )
{
    char s[ DL_LINII ];
    int znak, koniec = 0, i, j;
   
    /*sprawdzenie czy podano prawid³owy uchwyt pliku */
    if( p == NULL ) {
        fprintf( stderr, "Blad: Nie podano uchwytu do pliku\n" );
        return( 0 );
    }
    if( fgets( s, DL_LINII, p ) == NULL ) koniec = 1;
    /* Sprawdzenie "numeru magicznego - powinien byæ P2 */
    if(( s[ 0 ] != 'P' ) ||( s[ 1 ] != '2' ) || koniec ) {
        fprintf( stderr, "Blad: To nie jest plik PGM\n" );
        return( 0 );
    }
    /* Pominiecie komentarzy */
    do {
        if(( znak = fgetc( p ) ) == '#' ) {
            if( fgets( s, DL_LINII, p ) == NULL ) koniec = 1;
           
        } else {
            ungetc( znak, p );
        }
    } while( !koniec && znak == '#' );
   
    /* Pobranie wymiarow obrazu i liczby odcieni szarosci */
    if( fscanf( p, "%d %d %d", & wobr->wymx, & wobr->wymy, & wobr->szarosci ) != 3 ) {
        fprintf( stderr, "Blad: Brak wymiarow obrazu lub liczby stopni szarosci\n" );
        return( 0 );
    }
   
    /* Tworzymy dynamiczna tablice dwuwymiarowa */
    int( * obraz_pgm )[ wobr->wymx ];
    obraz_pgm =( int( * )[ wobr->wymx ] ) malloc( wobr->wymx * wobr->wymy * sizeof( int ) );
   
   
    /* Pobranie obrazu i zapisanie w tablicy obraz_pgm*/
    for( i = 0; i < wobr->wymy; i++ )
    {
        for( j = 0; j < wobr->wymx; j++ )
        {
            if( fscanf( p, "%d", &( wobr->obraz_pgm[ i ][ j ] ) ) != 1 ) {
                fprintf( stderr, "Blad: Niewlasciwe wymiary obrazu\n" );
                return( 0 );
            }
        }
    }
   
   
}



int main()
{
    FILE * plik;
    char nazwa[ 100 ];
    int odczytano = 1;
   
    obraz obr;
   
    printf( "Podaj nazwe pliku w formacie xxxxx.pgm:\n" );
    scanf( "%s", nazwa );
    plik = fopen( nazwa, "r" );
   
    if( plik != NULL ) /* co spowoduje zakomentowanie tego warunku */
         odczytano = czytaj( plik, & obr );
   
    negacja( & obr );
   
   
}
P-99646
quatromen
Temat założony przez niniejszego użytkownika
» 2013-12-19 17:17:03
Tamto tworzenie dynamicznej tablicy dwuwymiarowej jes tchyba raczej zle wydaje mi sie ze to juz bedzie trafniejsze ??? ???:


C/C++
/* Tworzymy dynamiczna tablice dwuwymiarowa */
wobr->obraz_pgm = malloc( wobr->wymx * wobr->wymy * sizeof( int ) );
int( * obraz_pgm )[ wobr->wymx ];
obraz_pgm =( int( * )[ wobr->wymx ] );
P-99652
DejaVu
» 2013-12-19 20:43:04
Jeden temat = jeden problem. Zamykam.
P-99665
« 1 »
  Strona 1 z 1