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

kopiowanie lancuchow z pliku

Ostatnio zmodyfikowano 2014-05-26 20:49
Autor Wiadomość
gzforever
Temat założony przez niniejszego użytkownika
kopiowanie lancuchow z pliku
» 2014-05-25 14:46:06
Weźmy plik , który wygląda z poziomu notatnika nastepująco:

C/C++
Witaj Magu !
Powodzenia w poszukiwaniu przygod !

mam tablice wskaźników
char *tab[3]
i 'tymczasowa' tablice char arr[90]

chcę aby tab[0] był wskaźnikiem na pierwszy wiersza tekstu pobranego z powyzszego pliku tekstowego, a tab[1] do tekstu "Powodzenia"z drugiego wiersza ,zaś tab[2] do tekstu " w poszukiwaniu przygód !". Mógłby ktoś po prostu napisać przykładowy kod, uzywając funkcji scanf/fgets ewentualnie fread ?

wystarczy mi kod kopiujący lancuchy do tymczasowej tablicy , dalej juz wiem jak alokowac i przepisywac lancuch z tejże tablicy do zaalokowanego obszaru.

cos w rodzaju (nasistotnieszy fragment kodu) :
C/C++
char adres[ 50 ];
gets( adres );
ptr = fopen( adres, "r" )
FILE * ptr;
int i;
for( i = 0; i < 3; i++ )
{
    char arr[ 90 ];
    fscanf // nie wiem jak ma wyglądać , moze byc fread albo fputs , byle dzialalo
    tab[ 0 ] =( char * ) malloc( strlen( arr ) + 1 );
    strcpy( tab[ 0 ], arr );
    fscanf // nie wiem jak ma wyglądać , moze byc fread albo fputs , byle dzialalo
    tab[ 1 ] =( char * ) malloc( strlen( tab ) + 1 );
    strcpy( tab[ 1 ], arr );
    fscanf // nie wiem jak ma wyglądać , moze byc fread albo fputs , byle dzialalo
    tab[ 2 ] =( char * ) malloc( strlen( arr ) + 1 );
    strcpy( tab[ 2 ], arr );
}
P-110831
libed
» 2014-05-25 21:44:17
C/C++
#include <cstdio>
#include <cstdlib>
#include <cstring>

typedef struct {
    char * data;
    unsigned int max_elems;
    unsigned int max_strlength;
    unsigned int first_avail;
} strtable;


strtable * create_table( unsigned int max_elems, unsigned int max_length ) {
    if( max_elems == 0 ) max_elems = 10;
   
    if( max_length == 0 ) max_length = 30;
   
    strtable * result =( strtable * ) malloc( sizeof( strtable ) );
    result->max_elems = max_elems;
    result->max_strlength = max_length;
    result->first_avail = 0;
    result->data =( char * ) malloc( result->max_elems * result->max_strlength );
    return result;
}

void expand_table( strtable * data, unsigned int elems_to_expand ) {
    if( data == NULL ) return;
   
    unsigned int new_max = data->max_elems + elems_to_expand;
   
    char * newtable =( char * ) malloc( new_max * data->max_strlength );
    memcpy( newtable, data->data,( data->max_elems * data->max_strlength ) );
    data->max_elems = new_max;
    free( data->data );
    data->data = newtable;
    printf( "Table expanded\n" );
}

int save_string( strtable * dest, const char * str ) {
    if( strlen( str ) > dest->max_strlength )
         return - 1;
   
    if( dest->first_avail == dest->max_elems )
         expand_table( dest, dest->max_elems );
   
    char * ptr = dest->data +( dest->first_avail * dest->max_strlength );
    strcpy( ptr, str );
    return dest->first_avail++;
}

const char * get_string( strtable * src, unsigned int idx ) {
    if( idx >= src->max_elems )
         return NULL;
   
    char * result = src->data +( idx * src->max_strlength );
    return result;
}

void save_to_file( strtable * data, const char * file_name, bool binary ) {
    if( data == NULL || file_name == NULL ) return;
   
    FILE * outf = fopen( file_name, "w" );
    if( !outf ) return;
   
    if( binary ) {
        int desc = 0x46525453;
        fwrite( & desc, sizeof( int ), 1, outf );
        desc = data->first_avail - 1; fwrite( & desc, sizeof( int ), 1, outf );
        desc = data->max_strlength; fwrite( & desc, sizeof( int ), 1, outf );
        fwrite( data->data, data->max_strlength, data->first_avail - 1, outf );
    }
    else {
        char * ptr = data->data;
        for( unsigned i = 0; i < data->first_avail; ++i ) {
            fprintf( outf, "%s\n", ptr );
            ptr += data->max_strlength;
        }
    }
    fclose( outf );
}

strtable * load_from_file( const char * filename ) {
    FILE * inf = fopen( filename, "rb" );
    if( inf == NULL ) return NULL;
   
    int desc = 0;
    strtable * strings =( strtable * ) malloc( sizeof( strtable ) );
    memset( strings, 0x00, sizeof( strtable ) );
    fread( & desc, sizeof( int ), 1, inf );
    if( desc == 0x46525453 ) {
        fread( & strings->max_elems, sizeof( unsigned int ), 1, inf );
        fread( & strings->max_strlength, sizeof( unsigned int ), 1, inf );
        strings->data =( char * ) malloc( strings->max_elems * strings->max_strlength );
        fseek( inf, 0x0C, SEEK_SET );
        fread( strings->data, strings->max_strlength, strings->max_elems, inf );
        strings->first_avail = strings->max_elems;
    }
    else {
        rewind( inf );
        strings->max_strlength = 50;
        strings->max_elems = 100;
        strings->data =( char * ) malloc( strings->max_strlength * strings->max_elems );
        char * ptr = strings->data;
        unsigned int len = 0;
        while( fgets( ptr, strings->max_strlength, inf ) ) {
            len = strlen( ptr );
            memset( & ptr[ len - 2 ], 0x00, 2 );
            ptr += strings->max_strlength;
            ++strings->first_avail;
        }
    }
    fclose( inf );
    return strings;
}

void clear_table( strtable * data ) {
    if( data == NULL )
         return;
   
    free( data->data );
    data->first_avail = 0;
    data->max_elems = 0;
    data->max_strlength = 0;
}

int main( int argc, char ** argv ) {
    if( argc < 2 )
         return 1;
   
    strtable * strings = load_from_file( argv[ 1 ] );
    if( strings != NULL ) {
        for( unsigned i = 0; i < strings->first_avail - 1; ++i )
             printf( "[%d] -> %s\n", i, get_string( strings, i ) );
       
        clear_table( strings );
    }
    return 0;
}

Dawno nic nie pisałem w C więc mogą się trafić jakieś głupie błędy.
P-110877
pekfos
» 2014-05-26 20:49:53
Dawno nic nie pisałem w C więc mogą się trafić jakieś głupie błędy.
Na przykład nagłówki języka C++ :)
P-110922
« 1 »
  Strona 1 z 1