neviem si poradit s fseek() funkciou

Sekcia: Programovanie 17.01.2008 | 19:17
Avatar timo ubuntu 7.10 gutsy gibbon  Používateľ
Potrebujem sa pohybovat v subore pomocou funkcie fseek() a ked tak spravim a chcem nieco zapisat ta sa mi text ktory som preskocil do zadu zmaze a ja neviem preco...
    • Re: neviem si poradit s fseek() funkciou 17.01.2008 | 19:54
      Avatar Dare_devil Debian, OpenSuse  Používateľ
      Sice sa do tejto f. nevyznam ale mohol by si zverejnit kod.. S tym by sme ti vedeli pomoct skor.
      There is no flag large enough to cover the shame of killing innocent people
      • Re: neviem si poradit s fseek() funkciou 17.01.2008 | 20:00
        Avatar timo ubuntu 7.10 gutsy gibbon  Používateľ
        #include "stdio.h"
        
        void main(void)
        {
          FILE *fp,*fp2;
          char c;
          int i,j,k;
        
          fp  = fopen("output.out","r");
          fp2 = fopen("output2.out","w");
          if (fp == NULL || fp2 == NULL) printf("File doesn't exist\n");
          else
          {
        k =1;
            do
            {
              i = 0;
              c = ' ';
              while ( c != '\n')
              {
                c = fgetc(fp);
                fputc(c,fp2);
        printf("%c", c);
                i++;
              }
              fseek(fp2,-1,SEEK_CUR);
              j = 1;
              while ( j <= (50 - i))
              {
                fputc(' ',fp2);
                j++;
              }
              fseek(fp2,1,SEEK_CUR);
        k++;
            } while (k <= 2);
          }
          fclose(fp);
          fclose(fp2);
        }
        • Re: neviem si poradit s fseek() funkciou 17.01.2008 | 20:06
          Avatar timo ubuntu 7.10 gutsy gibbon  Používateľ
          je to program ktory nacita zo suboru output.out 1 riadok a ked narazi na koniec riadku "\n" tak presunie sa o znak dozadu pred znak konca riadka "\n" a dopocita prazdne miesto aby kazdy riadok mal 50 miest.

          ten program namiesto toho aby sa presunul o znak dozadu a zapisal prazdne miesta tak zmaze ten znak "\n" a tak zapise prazdne miesta

          viem da sa to spravit aj jednoduchsie bez funkcie fseek() ale mne ide o ukazkovy priklad a malo by to fungovat ! tak neviem kde mam chybu pretoze po subore sa urcite da pohybovat.
          • Re: neviem si poradit s fseek() funkciou 17.01.2008 | 22:04
            Avatar linuxroot Gentoo desktop, Debian server  Používateľ
            Ale ved sa to sprava uplne normalne, to ze sa posunies o znak vzad a zacnes zapisovat, neznamena ze sa ten znak bude posuvat, jednoducho ho prepises medzerou, to nie je insert rezim, proste ty cez fseek nastavis poziciu v subore a ked zacnes zapisovat, tak pises od danej pozicii dalej, aj cez znak enter, tymto sposobom sa to riesit neda.
            • Re: neviem si poradit s fseek() funkciou 18.01.2008 | 17:53
              Avatar timo ubuntu 7.10 gutsy gibbon  Používateľ
              no presne si na tu chybu prisiel :-)

              a ako to mam poriesit resp. existuje nejake riesenie aby som zapol ten "insert mod"? Aby mi to neprepisovalo ale aby to vpisovalo?
              • Re: neviem si poradit s fseek() funkciou 18.01.2008 | 20:11
                Avatar Samuel BWPOW Kupka CentOS, Mandriva  Používateľ
                Nie. To si musis naprogramovat sam. Taha funkcia v libc nie je.
                Strach dát najevo své pocity a zjednat si u druhých respekt je jedním z problémů civilizovaného člověka, který se naučil zpochybňovat svou vlastní pravdu pro zdání objektivity
                • Re: neviem si poradit s fseek() funkciou 18.01.2008 | 20:49
                  Avatar Igor Hlina Mac OS ML  Používateľ
                  Ale no tak, urobil som rychly kuk do Ucebnice jazyka C od Herouta a tu predkladam vysledky:

                  Funkcia fopen() ma nasledujuci funkcny prototyp:
                  FILE *fopen(const char *meno, const char *rezim);
                  Rozne vyznamy parametru rezim:
                  r textovy subor pre citanie
                  w textovy subor pre zapis alebo prepisanie
                  a textovy subor pre pripojenie na koniec (cca to co timo hlada)
                  rb binarny subor pre citanie
                  wb binarny subor pre zapis alebo prepisanie
                  ab binarny subor pre pripojenie na koniec
                  r+ textovy subor pre citanie a zapis
                  w+ textovy subor pre citanie, zapis alebo prepisanie
                  a+ textovy subor pre citanie a zapis na koniec
                  rb+ binarny subor pre citanie a zapis
                  wb+ binarny subor pre citanie, zapis alebo prepisanie
                  ab+ binarny subor pre citanie a zapis na koniec
                  pozn.
                  Ak otvoris existujuci subor v rezime "w" alebo "wb", tento subor sa najskor vymaze a potom sa znovu zalozi. Dochadza teda k prepisaniu suboru.

                  Ak otvoris existujuci subor v rezime "a" alebo "ab", tak sa tento subor otvori a ukazatel pozicie sa posunie na jeho koniec. Dochadza teda k rozsireniu existujuceho suboru (append). Ak subor neexistuje, tak sa vytvori.

                  Ak pouzijeme rezim rozsireny o znak "+", je mozne subor pouzit zaroven pre citanie aj zapis, co ma ale prakticky vyznam iba pri binarnych suboroch.

                  Tak dufam, ze ma pan Herout nezavesi do prievanu za g..e, kvoli nejakym licenciam. Zaroven to asi hodim do DB znalosti, toto sa isto hodi vediet.

                  Dufam, ze to pomoze.
                  while (2*2 == 5) { echo "If you're reading this, something is definitely wrong"; }
                  • Re: neviem si poradit s fseek() funkciou 18.01.2008 | 20:53
                    Avatar Samuel BWPOW Kupka CentOS, Mandriva  Používateľ
                    Ak som spravne pochopil, tak on chce prave otvorit subor a na nejaku poziciu zapisat nejake riadky tak, aby sa tie za nimi posunuli. Ak to tak nie je, tak sa ospravedlnujem. Samozrejme parameter "a" zabezpeci to, aby sa pouzil existujuci subor a da sa do neho dopisovat, pri zapisovani do suboru sa vsak zvysok nebude posuvat ale prepisovat.
                    Strach dát najevo své pocity a zjednat si u druhých respekt je jedním z problémů civilizovaného člověka, který se naučil zpochybňovat svou vlastní pravdu pro zdání objektivity
                    • Re: neviem si poradit s fseek() funkciou 18.01.2008 | 20:55
                      Avatar Igor Hlina Mac OS ML  Používateľ
                      Ja som to zase pochopil tak, ze potrebuje append. Ak som to pochopil nespravne, tak sa ospravedlnujem ja. Samozrejme posuvanie obsahu si musi dokodit sam.
                      while (2*2 == 5) { echo "If you're reading this, something is definitely wrong"; }
                      • Re: neviem si poradit s fseek() funkciou 19.01.2008 | 18:31
                        Avatar timo ubuntu 7.10 gutsy gibbon  Používateľ
                        nie ja nepotebujem append, potrebujem vpisat znaky medzi dalsie...
              • Re: neviem si poradit s fseek() funkciou 18.01.2008 | 23:57
                Avatar linuxroot Gentoo desktop, Debian server  Používateľ
                je fakt ze sa to neda, subor je sekvencne zariadenie a ako s takym sa s nim musi aj narabat, potrebujes si to nakodit - ale to by nemal byt problem, nejaky buffer a cez neho to robit
                • Re: neviem si poradit s fseek() funkciou 19.01.2008 | 18:28
                  Avatar timo ubuntu 7.10 gutsy gibbon  Používateľ
                  ako ste to mysleli cez ten buffer? mozte mi to blizsie opisat?
    • Re: neviem si poradit s fseek() funkciou 17.01.2008 | 21:04
        Návštevník
      Co ma robit ten program?
      Posli tu cast kodu, kde to pouzivas.