c read, write

Sekcia: Programovanie 25.08.2011 | 18:23
Avatar Zer0 Slackware 13.37  Používateľ
Mam za ulohu vytvorit nezavislo platformovy program ktory nacita (zo suboru ) cely text a vlozi ho do 2 suboru a mam povolene funkcie iba read write chcem sa spytat ci sa da pouzit read write bez open a ak ano tak skuste ukazat, poradit.
    • Re: c read, write 25.08.2011 | 18:39
      Avatar Fridolín Pokorný Fedora 21  Používateľ
      Standardne otvara operacny system stdin, stdout, stderr (fd 0 az 2). Pravdepodobne chces, aby tvoj program pracoval ako filter, s tym, ze co dostane na vstup kopiruje na vystup (pozri man cat). write() a read() su POSIX (co nemusi byt uplne pre "nezavislo platformovy program"). Skus pozriet glibc a na co vsetko je portnuta - mohlo by to stacit.
      Skus este viac popisat problem, ak sme sa nepochopili.
    • Re: c read, write 25.08.2011 | 19:28
      miso   Návštevník
      Uloha nema riesenie, funkcie read a write nie su sucastou standardnej kniznice C. Su to wrappre pre prislusne systemove volania a teda su platformovo zavisle.
      • Re: c read, write 25.08.2011 | 21:10
        Avatar Zer0 Slackware 13.37  Používateľ
        Mam na mysli nieco take ale este by to chcelo vylepsit (fakt sa to neda urobit aby to islo na win aj na linux ? )a este potrebujem zistit tu dlzku
        #include <stdio.h>
        #include <stdlib.h>
        #include <fcntl.h>
        #include <sys/stat.h>

        int main()
        {

        int *file1;
        int i;
        int f1;
        int f2;
        int dlzka=100; /*este neviem ako zistim dlzku tak to je iba odhad skuste poradit poznam seek_end ale ten asi nemozem pouzit*/

        file1=(int *) malloc (dlzka*sizeof(int));

        f1=open("file",O_RDONLY,0); // funkciu open tiez nemozem pouzit
        f2=open("file2",O_CREAT | O_APPEND | O_WRONLY |O_TRUNC , S_IRUSR | S_IWUSR);

        for (i=0;i<20;i++)
        {
        i=read(f1,file1,dlzka);
        if (i != -1)
        write(f2,file1,i);
        }

        free(file1);
        return 0;
        }
        • Re: c read, write 25.08.2011 | 22:08
          Avatar m4jkl   Používateľ
          /*este neviem ako zistim dlzku tak to je iba odhad skuste poradit poznam seek_end ale ten asi nemozem pouzit*/

          staci si precitat manualovu stranku k read() ;)
        • Re: c read, write 25.08.2011 | 22:33
          Avatar Fridolín Pokorný Fedora 21  Používateľ
          1. funkcie read() a write() su deklarovane v hlavickovom subore unistd.h
          2. pozri si manualovu stranku k funkcii open() pre vysvetlenie jednotlivych bitovych parametrov
          3. nepouzivas nic zo stdio.h
          4. pouzi radsej funkcie zo standardnej knihovny jazyka C - fopen(), fgets(), fputs()
          5. riadiacu premenu cyklu i pouzivas nejak zahadne. skutocne ju tak chces pouzivat?

          Tu dlzku si neviem ako odhadol. V glibc sa pouziva buffer (typ a velkost podla toho o aky subor sa jedna). Preco nemozes pouzit funkcie open() a fopen()?
          • Re: c read, write 26.08.2011 | 00:46
            Avatar Zer0 Slackware 13.37  Používateľ
            Ano ten cyklus bol zly (vyvesil som neaktualizovanu verziu :D ) A este bez toho open sa to neda ?
            • Re: c read, write 26.08.2011 | 01:25
              Avatar Fridolín Pokorný Fedora 21  Používateľ
              Da, ak povies operacnemu systemu, aby ich "otvoril za teba".
              PS: pozeral si sa na cat?
              • Re: c read, write 26.08.2011 | 01:40
                Avatar Zer0 Slackware 13.37  Používateľ
                Nie nic take ako cat som nenasiel. A ako sa da povedat os aby ich "otvoril za mna" ? :D
                • Re: c read, write 26.08.2011 | 09:21
                  Avatar m4jkl   Používateľ
                  mozme vidiet originalne zadanie?
                  • Re: c read, write 26.08.2011 | 17:00
                    Avatar Zer0 Slackware 13.37  Používateľ
                    Vytvorte platformovo nezávislú aplikáciu, ktorá načíta vstupný vyraz vo formáte [XXX]Z1=Z2, Kde XXX je ľubovoľná (ľubovoľné dlhá aj niekoľko gigabajtov) postupnosť znakov 0-9 pripadne A-Z prípustných pre číselnú sústavu so základom Z1. Z2 je sústava, do ktorej ma byt načítané číslo prevedené a vypísané na štandardný výstup. Základy sústav Z1 a Z2 môžu byt od 2 až po 36 (znak reprezentujúci hodnotu 35 bude Z)

                    Príklad vstupného súboru:
                    [1012222121310101]4=32

                    Takéto číslo uvedené medzi [] reprezentuje hodnotu v štvorkovej sústave (sústave so základom 4) a má ju previesť do sústavy so základom 32.

                    Program si nemôže vytvárať žiadny dočasný súbor a nemôže sa v súbore pohybovať inak ako sekvenčným načítavaním tohto súboru pomocou funkcie read.

                    Program musí byť vytvorený v jazyku ANSI C (nie C++). Zo systémových volaní alebo knižničných funkcii môže používať iba funkcie read, write, malloc, free. Žiadne iné funkcie nie sú povolene (žiadne fread, fwrite, getchar, realloc ...).
                    Vstup

                    Vstupom je súbor s výrazom [číslo]z1=z2, ktorý bude presmerovaný na štandardný vstup.
                    Výstup

                    Výstupom je číslo v sústave so základom z2 vo formáte [číslo]z2.
                    //--------------------------------------------------------------------------------------------------------------------
                    Cele to je na http://www.joineset.sk/number_transfer.html
                    IMHO ja na ten job nemam ale skusam ulohuy vsade kde sa da :D
                    • Re: c read, write 26.08.2011 | 22:03
                      Avatar Dušan Ďurech Debian Lenny 5.0  Používateľ
                      • Re: c read, write 26.08.2011 | 22:04
                        Avatar Dušan Ďurech Debian Lenny 5.0  Používateľ
                        sorry, nedocital som to do konca, hned ked som to videl, tak som sem chcel pastnut odkaz na original :)
                        • Re: c read, write 27.08.2011 | 00:59
                          Avatar Zer0 Slackware 13.37  Používateľ
                          Co myslis si ze ty mi pomozes a ze ja dostanem job :D man nemozu zamestnat nemam 18 rokov (mne ide o tu ulohu tak zo srandy) ale ak nechces pomoct ja ta prosit nebudem :D A aj tak to bola asi blbost zacat riesit tu ulohu tak s tym asi skoncim
                          • Re: c read, write 27.08.2011 | 01:30
                            Avatar Fridolín Pokorný Fedora 21  Používateľ
                            Urcite to blbost nie je. Mozes sa pri tom nieco naucit (aj keby si to cele nevyriesil) ak ta to zaujima, no treba sa na to kusok pozriet. V ulohe nie je pisane o suboroch, ale o standardnom vstupe a vystupe. To je to, na co som ta navadzal na zaciatku s cat a tym "otvorenim od operacneho systemu" (a mnoho dalsich). Ak ta to este zaujima, pohladaj info o presmerovaniu. Urcite najdes viac nez dost.
                            • Re: c read, write 27.08.2011 | 01:39
                              Avatar Zer0 Slackware 13.37  Používateľ
                              Jaj tak sry no ja som si to iba raz precital a aj to nie vsetko iba tak co som uznal za vhodne :D jj zaujima skusim nieco najst dik :D toto sa mi uz raz stalo odteraz uz musim vsetko citat :D
                          • Re: c read, write 27.08.2011 | 01:56
                            Avatar Dušan Ďurech Debian Lenny 5.0  Používateľ
                            >>Co myslis si ze ty mi pomozes a ze ja dostanem job :D

                            Pomozem ti jedine tak, ze po skonceni sutaze (1 septembra) ti pastnem/poslem svoje riesenie :)
                            • Re: c read, write 27.08.2011 | 02:21
                              Avatar Zer0 Slackware 13.37  Používateľ
                              Co ty chces ten job ale ja ti nepomozem ja to sam neviem :D (ale skusam) A ja ta neziadam o riesenie a ak si poslal svoje riesenie ty tak vela stastia :D ja nic posielat nebudem ja iba skusam ulohu :)
                            • Re: c read, write 27.08.2011 | 02:21
                              Avatar Zer0 Slackware 13.37  Používateľ
                              Co ty chces ten job ale ja ti nepomozem ja to sam neviem :D (ale skusam) A ja ta neziadam o riesenie a ak si poslal svoje riesenie ty tak vela stastia :D ja nic posielat nebudem ja iba skusam ulohu :)
    • Re: c read, write 28.08.2011 | 22:02
      nechzijedeathmetal   Návštevník
      Servus, ja som to riesenie konecne dokoncil. Je to moj prvy program v C a prvy pod Linuxom takze som na seba hrdy aj ked je sakra pomaly :). Ale k tomu na co si sa pytal... patral som a ak som pochopil dobre, program ma pracovat tak ze zo standartneho vstupu nacita cislo a vypise ho na standartny vystup (zjednodusene z klavesnice na obrazovku - haha:)
      Na standardny vstup a vystup sa mozes pozriet ako na subory, ktore ma operacny system inicialne otvorene preto nemusis pouzit funkciu open() ani close().
      Staci read() - aby si nacital retazec z klavesnice a write() aby si ho vypisal. Pozri si unistd.h, ktora obrahuje tie funkcie a pogoogli a hlavne skus s tym poexperimentovat. Uvidis je to easy.
      Program ti bude fungovat aj pomocou suborov, ak pouzijes presmerovanie (urcite si sa s tym stretol, pozri man bash, kde by si mal najst sekciu REDIRECTION alebo napr http://tldp.org/LDP/abs/html/io-redirection.html - je toho mega na nete) takze ja svoj program spustam asi takto ./nazov < vstupny_subor_s_cislom.txt > skonvertovane_cislo_v_pozadovanej_sustacve.txt.
      Drzim prace a program dokonc aj ked po termine. Nieco sa naucis. Ked sa to mne podarilo urcite sa to podari aj tebe ;)
      Maj sa a googli :)
      • Re: c read, write 28.08.2011 | 22:04
        nechzijedeathmetal   Návštevník
        Inak ako to je s ANSI C a POSIX C? V zadani sa pise ze ma byt program napisany v ANSI C. To by ale znamenalo pouzit prave printf a pod z stdio.h. read() a write() nie su skor POSIXove funkcie?
        Dik za odpoved.
        • Re: c read, write 28.08.2011 | 22:40
          Avatar Dušan Ďurech Debian Lenny 5.0  Používateľ
          Program ma byt napisany v ANSI C, ale aj napriek tomu sa podla zadania musia pouzit funkcie "read" a "write" aj ked nie su v standarde ANSI C. Btw program som napisal a odovzdal aj ja, som v tabulke http://www.joineset.sk number_transfer.html (meno: "Dušan Ďurech")
          • Re: c read, write 28.08.2011 | 22:50
            Avatar juray ArchLinux  Používateľ
            uh paradne casy. ja som pouzil blby algoritmus a 100 000 cislicove cislo mi sroti 11 minut :D. tu pomocku "google: modern computer arithmetic" tam zverejnili az neskor, uz to nebudem prerabat a poslem to ako mam.
        • Re: c read, write 29.08.2011 | 11:56
          Avatar Fridolín Pokorný Fedora 21  Používateľ
          POSIX - Portable Operating System Interface
          ANSI C - americka norma C (uz starsia)
          POSIX je norma pre OS, ANSI C je jedna z noriem C. C ako jazyk nedefinuje funkcie pre I/O - to az standardna knihovna jazyka C.
          • Re: c read, write 29.08.2011 | 15:59
            Avatar Zer0 Slackware 13.37  Používateľ
            nechzijedeathmetal dik za podporu skusim sa preds do toho viac zazrat teraz resim nieco ale skusim to ked hovoris ze je to lahke
      • Re: c read, write 31.08.2011 | 19:07
        Avatar Zer0 Slackware 13.37  Používateľ
        Este mi prosim vysvetlite jednu vec ako mam pouzit read na citanie z klavesnice vsade na nete je ze iba zo suboru read (co mam dat tu ? , x ,y) ?
        • Re: c read, write 31.08.2011 | 21:27
          Avatar m4jkl   Používateľ
          read(STDIN_FILENO, buf, count);