24. september 2002 - 11:53Der er
22 kommentarer og 3 løsninger
tekstfil
Jeg har tidligere stillet et tilsvarende spørgsmål men endnu ikke fået det til at virke, så please help:
Hvordan erstatter man en vilkårlig linie i en tekstfil med en anden (muligvis kortere/længere)? Jeg kender liniens nummer i filen og det gør ikke noget der bliver oprettet en midlertidig fil, bare den bliver fjernet bagefter. Jeg må ikke ændre på filens navn og extension.... (input og output fil er det samme...)
1. YANK: * * * * [added 1998-04-19 updated 2000-03-02]. Like KLine, this program can be used to strip out entire lines containing a search string, but it also offers the option of replacing the line with another string rather than deleting it. Search and replace strings can be any combination of literals and ASCII codes. Other differences from KLINE: 1) YANK handles longer lines; 2) does not create a backup file; 4) "can read from another file both the search and replace string specifications or replacement text image (65,534 char. max; search string limit 4,095 char.)." Limitations: Unlike KLine, YANK doesn't output number of changes made per file. Works fine on my MS-DOS machine- but can't get it to work properly under OpenDOS. Part of the CUTPAK package. Author: Clay Ruth (1996, 2000). Sugg. by M. Van Erp.
Hvordan får jeg integreret det i mit program? Jeg skal, efter at have fundet de interessante linier i en fil, redigere i dem og denæst opdatere filen til atafspejle de nye linier. Det er kun det sidste der ikke virker...
Jeg har en FILE input, som er tekstfilen, kan jeg indlæse hele filen uden at få problemer med at filen er for stor (ofte 10000 linier +++) og hvordan laver jeg ændringen, kan je udskifte alt mellem to newlines eller???
Det er meget forskelligt (det er .cpp filer der er tale om hovedsageligt) og det kan være alt fra 1k til 300k +
Måske kunne bruge en midlertidig fil (kopier alt før linien, indsæt den rettede linie og kopier alt efter), men hvordan gør man det nemmest, så man får slettet den midliertige fil hver gang...
Hvis vi nu forestiller os at du har en tekstfil (a.txt) med k100 linjer, og du vil ændre noget i linje 42, kunne du gøre sådan her:
1) Opret en ny fil (b.txt) 2) Kopier de første 41 linjer fra a.txt til b.txt 3) Skriv den ændrede linje til b.txt 4) Kopier de efterfølgende linjer (linje 43 - 100) fra a.txt til b.txt 5) Slet evt a.txt og omdøb b.txt til a.txt
Ovenstående funktion tager flg. parametre: bool replace_line(char* filename, char* pReplaceBuf, int line, int num_lines = 1)
filename == giver sig selv pReplaceBuf == buffer, indeholdende den tekst der skal indsættes line == nul-baseret nummer på den linie der skal udskiftes num_lines == antal linier der skal udskiftes
Koden er lidt spaghetti-agtig, men den er platforms-uafhængig og kan nemt rettes lidt til...
jpk >> i nogle tilfælde, men foreløbig nøjes jeg med denne version, selvom der er noget overhead... Jeg kan jo senere ændre den, så den ændrer de ønskede linier, når resten af programmet kommer til at understøtte det
Hmmm...Det forslag jeg lagde her kan godt håndtere ændring af flere sammenhængende linier. Hvis det er ikke-sammenhængende linier der skal ændres er der en del overhead.
Man kunne jo i stedet for ...char* pReplaceBuf, int line, int num_lines... give en vector med flg. structs som noder:
typedef struct _ChangeNode { int line; int num_lines; char* pReplaceBuf; } ChangeNode;
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.