Avatar billede shj Nybegynder
19. september 1999 - 21:28 Der er 2 kommentarer og
2 løsninger

filhåndtering 2

hej igen nu er jeg ved egen hjælp kommet et skridt videre. Jeg sidder og prøver mig frem, så det er efterhånden blevet lidt rodet men alligevel!
denne her kode skal kopiere indholdet af en fil over i en anden derfter søger den efter ekstistensen af argv[3] i argv[2]. hvis denne forekomst eksistere skal den udskifte argv[3] med argv[4]
Men hvordan undgår jeg hvis nu argv[4] er meget større en argv[3] at andet tekst i filen bliver overskrevet.
her er koden:

#pragma hdrstop
#include <condefs.h>
#include <iostream.h>
#include<stdlib.h>
#include <fstream.h>
#include <stdio.h>
#include <string.h>
//---------------------------------------------------------------------------
#pragma argsused
//argv 0 = exe fil argv1 =fil1 argv2 = fil2 argv3 = ord der skal skiftes
int main(int argc, char* argv[])
//tæller
//først kopiere jeg indholdet af fil argument1 over i fil argument 2

{
int i;
char svar;
    if(argc!=5)
      {
      cout <<"angiv <filnavn> <filnavn><string><stringefter>\n";
      return 1;
      }
    fstream skriv(argv[2],ios::out|ios::in);
    fstream laes(argv[1],ios::in);
char linie[256];
char ord[64];
    if(!laes)
    {
        cout <<"filen " <<argv[1]<<" kan ikke åbnes\n";
        return 1;
    }
      while(! laes.eof())
      {
        laes.getline(linie,sizeof(linie));
        skriv<<linie;
      }
      cout<<"filen "<<argv[1]<<" blev kopieret over i "<<argv[2]<<"\n";
      laes.close();
      skriv.close();
      fstream samlign(argv[2],ios::in|ios::out);
      while(!samlign.eof())
      {
        samlign >> ord;
          if(strcmp(ord,argv[3])==0 )
            {
              //cout <<"ordet "<<argv[3]<<" Findes i "<<argv[2]<<endl;
              i= samlign.tellg();
              i = i - strlen(ord);
              //i indehilder nu ordets startposition, so mvi kan bruge i vores udskift routine

            samlign.seekg(i,ios::beg);
            while(*argv[4])
            {
            samlign.put(*argv[4]);
            *argv[4]++;


            }
          samlign.close();
            return 0;
          }
        }
}
hvis jeg skriver i dospromt
udskift test.dat test2.dat viggo pedersen vil ordet efter viggo blive  overskrevet?
Håber i kan hjælpe lidt så jeg kan blive klogere i det her c++
Hilsen Simon
Avatar billede bjarke Nybegynder
20. september 1999 - 09:31 #1
Hold da op, hvor du slynger om dig med spørgsmål her til morgen;-)

Nå, men jeg synes næsten at jeg lige har svaret på dette i spørgsmålet: "filhåndtering udskift ord i fil".
  Så jeg laver lige en cut'n'paste:

"Hvis det nye ord er længere, så opstår problemet først for alvor (jeg har selv bakset lidt med det for nylig og løst problemet - jeg kan evt. sende programstumpen når jeg kommer hjem, hvis du er interesseret). Problemet er ligesom når du skriver dansk stil i hånden: man kan ikke bare tilføje, for så skriver du jo oveni det som følger efter. Det betyder så, at du faktisk er nødt til at flytte hele resten af filens indhold (ja, det er sandt)."

Jeg har altså ikke koden her, og det tog et stykke tid at lave, men skriv hvis du vil have den, for så kan jeg som sagt sende den til dig (eller måske lægge den op her - så kan soepro jo optimere koden;-)
Avatar billede soepro Nybegynder
20. september 1999 - 11:09 #2
Det vil være meget lidt effektivt først at kopiere filen - før dernæst at løbe den kopierede fil igennem for at indsætte/erstatte et bestemt ord. I stedet for skal du selvfølgelig læse den originale fil - og så ENTEN skrive det du lige har læst, hvis det ikke var det ord der skal erstattes ELLER skal du blot skrive det nye ord.

Kodestumpen -frit efter mit svar på shjtip's spørgsmål 'argv og argc i main hvad er der galt med denne kode stump', som du kan finde andensteds på eksperten.dk- bliver så:

#include <fstream.h>
#include <stdlib.>
#include <string.h>

int main(int argc, char *argv[])
{
  char linie[256], *ptrLinie;
  char ord[64], *ptrOrd;
  if(argc!= 5)
  {
      cout<<"du skal angive fil1, fil2, streng1, streng2 i komando linien"<<endl;
      return 1;
  }
  ifstream fil_1(argv[1],ios::in);
  if(! fil_1)
  {
    cout <<"kan ikke åbne filen "<<argv[1]<<endl;
    return 1;
  }
  ifstream fil_2(argv[2], ios::out);
  if(! fil_2)
  {
    cout << "kan ikke danne filen "<<argv[2]<<endl;
    return 1;
  }
 
  cout << "Erstatter "<<argv[3]<< "med "<<argv[4]<<" i "<<argv[1]<<" og danner <<argv[2]<<" med nye indhold: "<< endl;

  while(! fil_1.eof())
  {
      fil_1.getline(ord, sizeof(ord), ' ');
      if((ptrord = strstr(ord, argv[3])) != NULL)
      {  /* ptrord peger på det sted i ord, hvor det søgte ord står. */
        /* Ved at indsætte '\x0' der, kan evt. tegn før ordet kopieres */
        /* ud til den nye linie. Herefter kan det nye ord + resten af det */         
        /* gamle kopieres ud - og den nye linie skrives. */       
        *ptrord = 0;
        strcpy(linie, ord);
        strcat(linie, argv[4]);
        ptrord += strlen(argv[3]);
        strcat(linie, ptrord);
        fil_2 << linie;
      }
      else
        fil_2 << ord;
  }
  return 0;
}
Avatar billede shj Nybegynder
20. september 1999 - 11:55 #3
Tak for de gode svar i sender mig, håber ikke i bliver alt for forpustet, men hold da k..... jeg for lært noget c++. Det begynder jo at blive rigtig sjovt at programmere.

Tak for hjælpen
Simon
Avatar billede bjarke Nybegynder
20. september 1999 - 12:10 #4
Fedt nok, det er jo det der tæller! Glæder mig at kunne hjælpe:-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester