"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

ANSI C, stdio: search & replace in file

SYSMATRIX 06.05.2003 - 12:33 1327 16
Posts

SYSMATRIX

Legend
Legend
Registered: May 2000
Location: ~
Posts: 5020
Bräuchte das Ganze fuer einen Freund, hab leider selbst wenig Zeit und meine Versuche von gestern haben mich nicht ausm gdb gelassen ... so plz help :)

Kurzbeschreibung:

Lesen Sie eine Textdatei ein, suchen Sie in dieser nach einem String, und Ersetzen Sie diesen durch einen anderen String.

Abzugebende Dateien:

searchreplace.c

searchreplace

Allgemeine Hinweise:

* Schreiben Sie Ihr Programm möglichst allgemein und kommentieren Sie es gut.
* Halten Sie die in der Vorlesung und Übung vorgegebenen Konventionen für Programmierstil und Kommentierung ein. Verwenden Sie, wenn nicht anders angegeben, nur die Standard-Bibliothek.



Aufgabenbeschreibung:

Erstellen Sie ein Programm, welches eine Textdatei einliest, und diese dann nach einem in der Kommandozeile angegebenen String durchsucht. Falls ein zweiter String in der Kommandozeile angegeben wurde, soll der gefundene String durch diesen ersetzt werden, so oft der Such-String in der Datei vorkommt.

Ausgabedaten:

Geben Sie die neue Datei - Originaldatei inkl. Änderung mit der Endung .new aus.

Fehlerbehandlung:

Falls die Datei oder der Suchtext nicht vorhanden ist soll eine Fehlermeldung ausgegeben werden...


MTIA
Bearbeitet von atrox am 07.05.2003, 19:54 (solved)

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
darf man strings.h verwenden ?

d3cod3

Legend
...
Avatar
Registered: Aug 2002
Location: insert location ..
Posts: 15288
naja, net gern gesehen aber ja

@sys. icq: wir haben schon was :)

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
die naive zeilenweise methode:

Code:
lese solange neue zeile
  suche suchstring mit strstr() in zeile -> matchposition
  wurde kein match gefunden (matchposition<0) THEN
    juhu keine arbeit: kopiere eingabezeile in ausgabedatei
  ELSE
    /*  Suchstring   [erster teil][match][zweiter teil] */
    // erster teil:
    kopiere zeichen 0 bis matchposition in ausgabedatei (strncpy())
    // match wird durch replacestring ersetzt
    kopiere replacestring in ausgabedatei
    // zweiter teil
    kopiere matchposition+strlen(suchstring) bis ende vom string in ausgabedatei

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
ich nehm mal stark an, es handelt sich um ne aufgabe für schule/studium (haha, wofür sonst - bei _der_ angabe...)

ich wehre mich strikt gegen das machen von schul-studien-aufgaben für andere - wo sollte der lerneffekt dabei sein? und sorry, nur weils diesmal ein admin is, der die frage stellt - auf einmal sind alle ganz ausgewechselt...

noch dazu isses primivst - wie atrox schon erfolgreich dargestellt hat - und wenn dein freund nichtmal diese aufgabe bewältigen kann - sorry, dann ghört er einfach nicht auf eine schule/uni wo soetwas verlangt wird.

SYSMATRIX

Legend
Legend
Registered: May 2000
Location: ~
Posts: 5020
Zitat von watchout
ich nehm mal stark an, es handelt sich um ne aufgabe für schule/studium (haha, wofür sonst - bei _der_ angabe...)

ich wehre mich strikt gegen das machen von schul-studien-aufgaben für andere - wo sollte der lerneffekt dabei sein? und sorry, nur weils diesmal ein admin is, der die frage stellt - auf einmal sind alle ganz ausgewechselt...

noch dazu isses primivst - wie atrox schon erfolgreich dargestellt hat - und wenn dein freund nichtmal diese aufgabe bewältigen kann - sorry, dann ghört er einfach nicht auf eine schule/uni wo soetwas verlangt wird.

der ist anderswo sicher begabter als du ;) ...


#include <stdlib.h>
#define MAXLINE 1024
#include <string.h>
int getline(FILE *fp,char s[], int lim);


int main(int argc, char *argv[])
{
FILE *fpin;
FILE *fpout;
char line[MAXLINE]={0};
char newline[MAXLINE]={0};
char* firstpart;
char* secondpart;
char* match;
char outfilename[255]={0};
int linelen=0;
int found=0;
char* matchpos;
char* p;

int index;

if (argc != 4)
printf("usage: searchreplace searchfile searchstring replacestring\n");
else exit(1);
fpin=fopen(argv[1],"r");
if (fpin == NULL){ printf("error openening %s \n");}
else

{
strcpy(outfilename,argv[1]);
strcat(outfilename,".new");
fpout=fopen(outfilename, "w");

while(linelen=getline(fpin,line,MAXLINE) > 0)
{

if((matchpos=strstr(line, argv[2]))== NULL)
{
fprintf(fpout,"%s", strcpy(newline,line));
}
else
{
index=matchpos-line;
memcpy(newline, line, index);
memcpy(newline + index, argv[3], strlen(argv[3]));
memcpy(newline + index+strlen(argv[3]),
line + index+strlen(argv[3]),
strlen(line)-index+strlen(argv[3]));
fprintf(fpout,"%s", newline);
}
}

}

return 0;
}

int getline(FILE *fp,char s[], int lim)
{
int c, i;
for(i=0;i<lim-1 && (c=getc(fp))!=EOF && c!= '\n';i++)
s[i] = c;

if(c == '\n')
{
s[i] = c;
i++;
}
s[i]= '\0';
return i;
}
Bearbeitet von SYSMATRIX am 07.05.2003, 07:21 (for readability)

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von SYSMATRIX
der ist anderswo sicher begabter als du ;) ...
meinst das interessiert mich? ich hatte auch probs mit meiner diplomarbeit, glaubst ich bin zu wem andern gangen und habs von ihm machen lassen?? :rolleyes: :bash:

d3cod3

Legend
...
Avatar
Registered: Aug 2002
Location: insert location ..
Posts: 15288
abundzu ist es hilfreich wenn einem jemand hilft wenn man 10000 sachen zu tun hat. i hab selber durch die aufgabenstellung da viel zeit vertan die ich anders nötiger gebraucht hätte. ich bin auch gegen alles machen aber wenn man einmal aushilft seh ich nix tragisches dran

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
ja, und morgen fragt einer ob ihm wer ein programm schreibne kann, dass "Hallo Welt" auf den Screen pinselt

d3cod3

Legend
...
Avatar
Registered: Aug 2002
Location: insert location ..
Posts: 15288
bei sowas verteh ich deine aufregung. aber bei nem konkreten problem dass nimmer in den basics rumgrundelt (sicher, manche sehen das auch noch als basics) denk ich kann man schon mal wen um hilfe fragen

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von d3cod3
bei sowas verteh ich deine aufregung. aber bei nem konkreten problem dass nimmer in den basics rumgrundelt (sicher, manche sehen das auch noch als basics) denk ich kann man schon mal wen um hilfe fragen
bitte... eine REPLACE-Function zu schreiben ist höchstens dann aufwendig, wenn du dir gedanken über die performance machen musst, das steht aber in keinster weise in der angabe


@sysmatrix: bitte, es haben _nicht_ alle menschen ne bildschirmauflösung von 3200x2400

SYSMATRIX

Legend
Legend
Registered: May 2000
Location: ~
Posts: 5020
Zitat von watchout
bitte... eine REPLACE-Function zu schreiben ist höchstens dann aufwendig, wenn du dir gedanken über die performance machen musst, das steht aber in keinster weise in der angabe


@sysmatrix: bitte, es haben _nicht_ alle menschen ne bildschirmauflösung von 3200x2400
sry, edited.

Vivo

Dreamworker
Avatar
Registered: May 2002
Location: Tal der Könige
Posts: 1478
Sry für den folgenden Offtopic beitrag aber das muss ich loswerden :

Ich habe noch nie verstanden wie man posten kann das man nicht bereit ist jmd bei einem Problem nicht zu helfen ? Wozu ?
Wer hilfsbereit ist und willig das zu machen soll das tun, wenn jeder der Meinung ist, er sollte den Kram selber erledigen oder es ist lächerlich etwas derartiges zu poste, bekommt er eh keine Antwort.
Also wozu immer diese Aufregerei ??

Und Lerneffekt hin oder her -> ich glaub das kann jeder selber Entscheiden. Und jede Fachrichtung liegt einfach nicht jedem gleich gut ...

FMFlash

tranceCoder
Avatar
Registered: Mar 2001
Location: Wien
Posts: 2037
eine problemstellung posten ohne vorher daran gearbeitet zu haben, nicht weiter nachdenken und dann die lösung zu copy / pasten ist wohl nicht der rechte weg, aber ein sehr guter lerneffekt wird imho dann erzielt wenn sich jemand mit einem problem bereits intensiv beschäftigt hat, aus eigener kraft aber keine funktionsfähige lösung zustande bringt und deshalb nach einer solchen anfragt und auch bekommt. so funktioniert lernen nunmal.

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
also diesem thread kann man weder vorwerfen daß er keinen lerneffekt gebracht hat, daß sich der poster nicht damit vorher beschäftigt hat, noch daß die lösung gänzlich von wem anderen gefertigt wurde.

man kann sich nun streiten welcher der 3 punkte wie stark ausgeprägt ist, aber ein typischer "hilfe, will mich nicht beschäftigen, macht mir bitte meine hausübung"-thread war es nicht. ein paar zeilen pseudocode - als hilfe - schmälern vielleicht die eigenleistung, reduzieren sie aber nicht nahe der 0. (für mich währe der aufwand größer gewesen, den lösungshinweis in einen schön formulierten text zu gießen, als die paar zeilen)

IMHO war die eskalation deshalb unangebracht.
(obwohl hier im forum der instinkt, hü-beispiele zu entdecken und arbeitsunwillige zu enttarnen stark ist)
Bearbeitet von atrox am 07.05.2003, 16:54
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz