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

[C Linux] - Odczyt prostych danych z pliku txt

Ostatnio zmodyfikowano 2015-07-01 10:59
Autor Wiadomość
Alt123
Temat założony przez niniejszego użytkownika
[C Linux] - Odczyt prostych danych z pliku txt
» 2015-06-30 18:57:37
Czesc,
pisze sobie taka mini aplikacje klient serwer w C pod Linuxem. Generalnie ma to byc "sprawdzarka cen w sklepie komputerowym". Z poziomu klienta chce podawac Kod Towaru (jakis integer) to ma byc sprawdzone przez serwer w bazie danych jako plik txt i odpowiedz z Nazwa Towaru i Cena ma byc wyslana do klienta i tam wyswietlona.

Na razie program testowo dziala tak, ze zamienia litery z malych na duze.

Mam problem bo nie wiem jak ogarnac to odczytywanie danych z tego pliku txt. Plik txt bedzie tworzony recznie wiec nie jest potrzebny zaden interfejs do dodawania towaru. Wystarczy tylko odczytywanie danych z tego pliku.

Macie jakies pomysly?
Jesli macie jakies inne prostsze pomysly jak to mozna zrealizowac to chetnie wyslucham.

Kod klienta:
C/C++
/* proces klienta */

#include <netdb.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/un.h>
#include <errno.h>
#include <stdlib.h>
#include <signal.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define SIZE sizeof(struct sockaddr_in)

int main()
{
    int sockfd;
    char c, rc;
    struct sockaddr_in server = { AF_INET, 7000 };
   
    /* przeksztalc i zapamietaj adres ip serwera */
    server.sin_addr.s_addr = inet_addr( "127.0.0.1" );
   
    /* ustaw punkt koncowy transportu: */
    if(( sockfd = socket( AF_INET, SOCK_STREAM, 0 ) ) == - 1 )
    {
        perror( "socket call failed" );
        exit( 1 );
    }
   
    /* polacz gniazdo z adresem serwera: */
    if( connect( sockfd,( struct sockaddr * ) & server, SIZE ) == - 1 )
    {
        perror( "connect call failed" );
        exit( 1 );
    }
   
    /* wysylaj i odbieraj informacje od serwera: */
    for( rc = '\n';; )
    {
        if( rc == '\n' )
             printf( "Podaj kod towaru aby otrzymac nazwe i cene:\n" );
       
        if( c == 'q' )
        {
            printf( "Program konczy prace...\n" );
            exit( 0 );
        }
        c = getchar();
        send( sockfd, & c, 1, 0 );
       
        if( recv( sockfd, & rc, 1, 0 ) > 0 )
             printf( "%c", rc );
        else
        {
            printf( "server has died.\n" );
            close( sockfd );
            exit( 1 );
        }
    }
}

Kod serwera:
C/C++
/* proces serwera */

#include <netdb.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/un.h>
#include <errno.h>
#include <stdlib.h>
#include <signal.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define SIZE sizeof(struct sockaddr_in)

void catcher( int sig );
int newsockfd;

int main()
{
    printf( "Serwer jest gotowy aby przyjac zapytanie...\n" );
   
    int sockfd;
    char c;
    /* zainicjuj gniazdo internetowe z numerem portu 7000
    * i adres lokalny, okreslany jako INADDR_ANY
    */
    struct sockaddr_in server = { AF_INET, 7000, INADDR_ANY };
    static struct sigaction act;
   
    act.sa_handler = catcher;
    sigfillset( &( act.sa_mask ) );
    sigaction( SIGPIPE, & act, NULL );
   
    /* ustaw punkt koncowy transportu: */
    if(( sockfd = socket( AF_INET, SOCK_STREAM, 0 ) ) == - 1 )
    {
        perror( "socket call failed" );
        exit( 1 );
    }
   
    /* zwiaz adres serwera z punktem koncowym */
    if( bind( sockfd,( struct sockaddr * ) & server, SIZE ) == - 1 )
    {
        perror( "bind call failed" );
        exit( 1 );
    }
   
    /* zacznij nasluchiwac przychodzacych polaczen */
    if( listen( sockfd, 5 ) == - 1 )
    {
        perror( "listen call failed" );
        exit( 1 );
    }
   
    for(;; )
    {
        /* przyjmij polaczenie */
        if(( newsockfd = accept( sockfd, NULL, NULL ) ) == - 1 )
        {
            perror( "accept call failed" );
            continue;
        }
       
        /* utworz proces potomny do pracy z polaczeniem */
        if( fork() == 0 )
        {
            /* odbierz dane: */
            while( recv( newsockfd, & c, 1, 0 ) > 0 )
            {
                /* zamien na wielkie litery i odeslij z powrotem: */
                if( c == 'q' )
                {
                    printf( "Program konczy prace...\n" );
                    exit( 0 );
                }
                c = toupper( c );
                send( newsockfd, & c, 1, 0 );
            }
            /* gdy klient nie wysyla dluzej informacji gniazdo moze byc zamkniete
            * i proces potomny zakonczony  */
            close( newsockfd );
            exit( 0 );
        }
        /* rodzic nie potrzebuje newsockfd: */
        close( newsockfd );
    }
}

void catcher( int sig )
{
    close( newsockfd );
    exit( 0 );
}

Plik txt ma taka postac:
1 Monitor 500zl
2 Dysk 200zl
3 Mysz 50zl


Pozdrawiam!
P-134192
darko202
» 2015-07-01 08:30:38
P-134203
Alt123
Temat założony przez niniejszego użytkownika
» 2015-07-01 10:59:20
Dzieki Kolego za chec pomocy!

Przeczytam te linki od Ciebie.

Natomiast one dotycza c++ a ja pisze to w czystym c.

Kod narazie jest probny i bedzie przerobiony pod moje zadanie ale najwiekszy problem mam z importem danych z tego pliku do mojego programu. Sprawdzilem to w ksiazkach ktore mam pod reka - S. Prata - Szkola programowania i tam jest tylko prosta operacja odczytu jednego slowa albo liczenia znakow. Moze niepotrzebnie sobie utrudniam to zadanie i da sie to zrobic w jakis prostszy sposob, na przyklad jakis inny uklad informacji w tym pliku albo cos takiego.

Mimo wszystko dzieki za odpowiedz.

Gdyby ktos jeszcze chcial cos napisac to chetnie wyslucham Waszych rad.


Pozdrawiam.
P-134208
« 1 »
  Strona 1 z 1