Forum Linux.pl

Programowanie => C/C++ => Wątek zaczęty przez: xKomandosx w 2006-05-03, 14:36:07

Tytuł: write(), read() problem
Wiadomość wysłana przez: xKomandosx w 2006-05-03, 14:36:07
Instlowałem Debiana (po raz pierwszy)

przy wyborze X window system zaznaczylem domyslne SECA (czy jakos tak) wszystko z instalacja poszlo dobrze tyle ze jak sie linux juz mial uruchamiac to czarny ekran i zero grafiki

wzialem jeszcze raz install debiana i tym razem wybralem VGA no i teraz widac jakies srodowisko graficzne ale kolorow to cyba jest 16 a rozdz. 640x480

co mam zrobic zeby to wygladalo normalnie ?
Tytuł: write(), read() problem
Wiadomość wysłana przez: Lorenzo w 2006-05-03, 15:07:13
Możesz ustawić driver na vesa - standartowa SVGA. Ale najlepiej by było gdybyś wiedział na jakiej karcie jedziesz i ją ustawił.
Tytuł: write(), read() problem
Wiadomość wysłana przez: xKomandosx w 2006-05-03, 16:02:08
2006-05-03 15:07:13 Lorenzo napisał:

> Możesz ustawić driver na vesa - standartowa SVGA. Ale najlepiej by było gdybyś wiedział na
 > jakiej karcie jedziesz i ją ustawił.

ale jak to zrobic ?
moja karta grafiki (jesli o to chodzi) GeForce FX5200 64 MB
Tytuł: write(), read() problem
Wiadomość wysłana przez: Lorenzo w 2006-05-03, 19:37:18
Jesli masz Sarge\\'a :

dpkg-reconfigure xserver-xfree86

Jesli etch/sid/sarge+backports

dpkg-reconfigure xserver-xorg

i wybierz nv jako sterownik.
A najlerpiej bys zrobił budując moduły nvidii. Potrzebujesz do tego drivery ze strony nvidii i paczke kernel-headers-twoja_wersja_kernela

P.S. W przypadku etch/sid linux-headers-2.6.ileś_tam
Ponadto - wyszukiwarka z lewej, http://dug.net.pl. Wałkowane raz w tygodniu
Tytuł: write(), read() problem
Wiadomość wysłana przez: nstn w 2006-05-03, 13:30:56
Jestem nowy jesli chodzi o programowanie pod linuxem.
Zadano mi takie zadanie:
używając funkcji read należy pobrac 2 łancuchy znakow ze standardowego wejscia oraz wyswietlic ponownie lancuch zawierajacy wiekasza liczbe znakow. W przypadku gdy lancuchy sa rowne, nalezy wyswietlic oba. Do wyswietlenia danych uzyc funkcji write.

Przeczytalem znaleziony gdzies w necie opis funkcji read i write, ale nie wiem jak zastosowac to do tego zadania. Byc moze dla niektorych osob takie zadanie to pestka, ale moze pomogl by mi ktos zrobic to zadanie. Albo chociaz jakies przykladowe wykorzystanie write i read, ktore dotyczylo by mojego zadania.
Tytuł: write(), read() problem
Wiadomość wysłana przez: chmooreck w 2006-05-03, 14:02:14
2006-05-03 13:30:56 nstn napisał:

> Jestem nowy jesli chodzi o programowanie pod linuxem.
 > Zadano mi takie zadanie:
 > używając funkcji read należy pobrac 2 łancuchy znakow ze standardowego wejscia oraz wyswietlic
 > ponownie lancuch zawierajacy wiekasza liczbe znakow. W przypadku gdy lancuchy sa rowne, nalezy
 > wyswietlic oba. Do wyswietlenia danych uzyc funkcji write.
 >
 > Przeczytalem znaleziony gdzies w necie opis funkcji read i write, ale nie wiem jak zastosowac
 > to do tego zadania. Byc moze dla niektorych osob takie zadanie to pestka, ale moze pomogl by mi
 > ktos zrobic to zadanie. Albo chociaz jakies przykladowe wykorzystanie write i read, ktore
 > dotyczylo by mojego zadania.

http://rtfm.killfile.pl

C ?
masz to na jakies zadanie domowe ? jesli tak, to zapewne cala potrzebna wiedze ktos ci juz staral sie co najmniej raz przekazac - trzeba bylo uwazac...

a moze zaproponuj jakas wersje wyjsciowa ? przedyskutujemy razem... moze dojdziemy do czegos sensownego, a ty sie przynajniej choc troche nauczysz...

... na gotowe rozwiazanie raczej bym w tym miejscu nie liczyl ;-) chociaz z pewnoscia dla wielu stalych bywalcow zadanie to jest blahostka...
Tytuł: write(), read() problem
Wiadomość wysłana przez: Lorenzo w 2006-05-03, 14:27:43
Jak to nie wiesz. Pobierasz dane wejsciowe w postaci dwóch łańcuchów, sprawdzasz warunkiem długości i wypisujesz.
A tu o funkcjach read() i write()
man read
man 2 write
Tytuł: write(), read() problem
Wiadomość wysłana przez: nstn w 2006-05-03, 22:07:12
udalo mi sie do tej pory wymyslec cos takiego:

#include
#include
#include

int main()
{
size_t length;
char * buffer;
buffer=(char *)malloc(length);
ssize_t bytes_read;
int fd;

bytes_read = read(fd, buffer, length);
//wczytane dane wrzucimy do buffer

//tu trzeba dac warunki za pomoca if , a dalej write
write(fd, buffer, length);
return 0;
}


ale naprawde nie wiem jak mam pobrac dane wejsciowe (w postaci dwóch łańcuchów)
Tytuł: write(), read() problem
Wiadomość wysłana przez: chmooreck w 2006-05-03, 23:40:49
2006-05-03 22:07:12 nstn napisał:

 > size_t length;
 > char * buffer;
 > buffer=(char *)malloc(length);
 > ssize_t bytes_read;
 > int fd;
 >
 > bytes_read = read(fd, buffer, length);
 > //wczytane dane wrzucimy do buffer
 >
 > //tu trzeba dac warunki za pomoca if , a dalej write
 > write(fd, buffer, length);
 > return 0;
 > }

no i super...
nie sadzisz, ze zmienne trzebaby zainicjalizowac ?

czy uzycie read i write jest obligatoryjne (sa funkcje lepiej nadajce sie do twojego zadania) ?

dlaczego bufor alokujesz dynamicznie (nie oznacza to, ze jest to niepoprawne... tylko napisz dlaczego) ?
czy na pewno jeden bufor ci wystarczy ?
Tytuł: write(), read() problem
Wiadomość wysłana przez: nstn w 2006-05-04, 19:26:54
jak mam pobrac dane wejsciowe (w postaci dwóch łańcuchów)

bo tego w zasadzie nie wiem.

Z konsoli to bym uzyl cat zeby wpisac do pliku, a tu????
Tytuł: write(), read() problem
Wiadomość wysłana przez: nstn w 2006-05-04, 19:30:20
2006-05-03 23:40:49 chmooreck napisał:


 > czy uzycie read i write jest obligatoryjne (sa funkcje lepiej nadajce sie do twojego zadania)
 > ?
 >
 > dlaczego bufor alokujesz dynamicznie (nie oznacza to, ze jest to niepoprawne... tylko napisz
 > dlaczego) ?
 > czy na pewno jeden bufor ci wystarczy ?


1. read i write muszą byc uzyte
2. bufor alokuje dynamicznie bo nie wiem ile znakow bedzie mial ten ciąg znakow
3.byc moze potrzebowalbym dwoch buforow, w koncu mają byc dwa ciągi znakow
4. ale jak wprowadzic te dane? Nie kumam tego
Tytuł: write(), read() problem
Wiadomość wysłana przez: jk33 w 2006-05-04, 20:25:22
2006-05-04 19:30:20 nstn napisał:

 > 2. bufor alokuje dynamicznie bo nie wiem ile znakow bedzie mial ten ciąg znakow

Mhm... Tylko, jeśli dobrze rozumiem, najpierw musisz wczytać ten ciąg, żeby
policzyć jego długość, więc jest tu problem...
Ponadto w Twoim kodzie nie wiadomo skąd bierzesz to length (jest deklaracja
zmiennej, ale gdzie nadajesz jej wartość?)

Nie masz w  specyfikacji zadania podanych jakiś maksymalnych długości ciągów?

Potrafisz napisać ten program uzywając stdio.h ?
Tytuł: write(), read() problem
Wiadomość wysłana przez: chmooreck w 2006-05-04, 20:37:53
2006-05-04 19:30:20 nstn napisał:

 > 2. bufor alokuje dynamicznie bo nie wiem ile znakow bedzie mial ten ciąg znakow

to teraz mi powiedz jakiej dlugosci bufor zaalokowales... bo nie daje mi to spokoju ;-)

 > 4. ale jak wprowadzic te dane? Nie kumam tego

poczytaj co to jest ten fd (file descriptor)...
Tytuł: write(), read() problem
Wiadomość wysłana przez: j3drek w 2006-05-04, 22:02:53
ja kiedys napisalem takie cos

zwraca zaalokowany dynamicznie lancuch, musisz go zwolnic za pomoca free() w bsize jest ilosc wczytanych danych
 
void *intobuff(int *bsize)
{
        if (!bsize)
                return NULL;

        char stat_b[1024];
        int stats = 1024;

        *bsize = 0;
        int s;
        char buf;
        s = 0;
        int g_size = 0;
        int w_size = 0;
        void *res = NULL;
        int end;
        while (1){
          fread(&buf, 1, 1, stdin);
                end = feof(stdin);
                if (!buf){
                        fprintf(stderr, "HTMLP: W buforze wejsciowym na pozycji %d pojawil sie znak konca pliku 0x0, a nie wczytano jescze wszystkiego!n", g_size);
                        end = 1;
                }
                stat_b = buf;
                if ( (s >= stats) || ( end ) ){
                        if (res){
                                res = realloc(res, g_size);
                        } else
                        {
                                if ( s < stats)
                                        res = malloc(s);
                                else
                                        res = malloc(stats);
                        }
                        memcpy(res + w_size, &stat_b[0], s);
                        w_size += s;
                        if (end)
                                break;
                }
                s++;
                g_size++;
                if (s > stats)
                        s = 0;
        }
        *bsize = g_size;
        return res;
}


troche to zagmatwane, i trzeba by to deczko przerobic ale moze sie przyda...
Tytuł: write(), read() problem
Wiadomość wysłana przez: chmooreck w 2006-05-04, 22:59:55
wydaje mi sie, ze autorowi zadania chodzilo o wykorzysztanie funkcji read i write, a nie automatyczna alokacje bufora odpowiedniej wielkosci ;-)
Tytuł: write(), read() problem
Wiadomość wysłana przez: j3drek w 2006-05-05, 11:22:32
2006-05-04 22:59:55 chmooreck napisał:

> wydaje mi sie, ze autorowi zadania chodzilo o wykorzysztanie funkcji read i write, a nie
 > automatyczna alokacje bufora odpowiedniej wielkosci ;-)

no wiem :-)
ale to jest tylko przyklad, a nie rozwiazanie tego konkretnego zadania.

Poza tym jest tam uzycie read(), wlasciwie fread() ale mozna by to zastapic :P

i na koniec taka dobra rada dla @nstn manuale systemowe to podstawa, tam jest praktycznie wszystko :)
Tytuł: write(), read() problem
Wiadomość wysłana przez: chmooreck w 2006-05-05, 21:23:04
na kiedy masz zrobic to zadanie ?
Tytuł: write(), read() problem
Wiadomość wysłana przez: nstn w 2006-05-05, 22:06:18
2006-05-05 21:23:04 chmooreck napisał:

> na kiedy masz zrobic to zadanie ?
 na niedziele ale moze kumpel dzisiaj cos tez wymysli i moze dorzuci tu kilka swoich zlotych mysli

aha, i jeszcze jedno
nikt mi nic nigdy nie tłumaczyl na ten temat
Tytuł: write(), read() problem
Wiadomość wysłana przez: chmooreck w 2006-05-05, 23:39:22
2006-05-04 20:37:53 chmooreck napisał:

> 2006-05-04 19:30:20 nstn napisał:
 >
 >  > 2. bufor alokuje dynamicznie bo nie wiem ile znakow bedzie mial ten ciąg znakow
 >
 > to teraz mi powiedz jakiej dlugosci bufor zaalokowales... bo nie daje mi to spokoju ;-)

??

 >  > 4. ale jak wprowadzic te dane? Nie kumam tego
 >
 > poczytaj co to jest ten fd (file descriptor)...

w szczegolnosci czy ma jakis zwiazek ze standardowym wejsciem i wyjsciem ?


 > nikt mi nic nigdy nie tłumaczyl na ten temat

to najwyzszy czas zajrzec do manuali ;-)

P.S.
WYJATEK (tylko dla mstn, dla tego watku): jesli chcesz, to mozesz przeslac mi na maila twoje gg, moze akurat znajde chwilke, zeby ci pomoc... potem OBOWIAZKOWO dzialajacy program wklej tu, na forum, laczie z komentarzem co sie skad wzielo... ;-)
Tytuł: write(), read() problem
Wiadomość wysłana przez: chmooreck w 2006-05-07, 19:59:46
poniewaz jest juz schylek niedzieli i tak mam juz to napisane... dla potomnosci...


#include

#define MAX_BUF_LEN 1024

int main(int argc, char ** argv)
{
  char str1[MAX_BUF_LEN];
  char str2[MAX_BUF_LEN];
  int str1len, str2len;

  str1len = read (0, str1, MAX_BUF_LEN);
  if (str1len == -1 ){
    // Obsluga bledu    
    return 1;
  }
  str2len = read (0, str2, MAX_BUF_LEN);
  if (str2len == -1 ){
    // Obsluga bledu    
    return 2;
  }

  if (str1len >= str2len){
    write(1, str1, str1len);
  }
  if (str1len <= str2len){
    write(1, str2, str2len);
  }

  return 0;
}


i jeszcze tytulem wytlumaczenia dla nstn:
stdin zawsze ma deskryptor pliku rowny 0, stdout 1, a stderr 2
strumienie te otwiera dla kazdego programu system i my nie musimy sie martwic ich otwieraniem i nie powinnismy ich zamykac... reszta chyba dla ciebie jest oczywista ;-)
Tytuł: write(), read() problem
Wiadomość wysłana przez: nstn w 2006-05-08, 18:10:51
wiedzialem ze to zadanie jest proste, ale nie myslalem ze az tak...


dzieki chmooreck