19. september 1999 - 21:28Der 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.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
Manuelle og semi-automatiske strategier for identitetsstyring virker - lige indtil nogen beder om dokumentation. For at undgå denne fare har DKTV taget kontrol over sin identitets- og adgangsstrategi.
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;-)
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å:
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; }
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.
Fedt nok, det er jo det der tæller! Glæder mig at kunne hjælpe:-)
Synes godt om
Ny brugerNybegynder
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.