PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : String in datei suchen!?



Taktloss
31-05-2003, 21:12
Also, ich suche derzeit nach einer lösung wie ich mittels C oder C++ in eienr textdatei der ofstream oder sonstigem stream nach einem bestimmten string suchen kann. Außerdem muss überprüft werden, ob der erste char ein # ist. Danach soll diese Zeile gelöscht werden und mit einem neuen String überschrieben werden. hätte da jemand einen beispiel source?
Was auch praktisch wäre, wäre wenn mit jemand sagen könnte, wie ich evtl. die zeilen nr. auslesen kann, in der ein bstimmter string steht und wie ich gezielt eine bestimmte Zeile überschreiben kann!?
MfG. Taktloss

BLUESCREEN3D
01-06-2003, 01:14
#include <fstream>
#include <string.h>

using namespace std;

int main()
{
ifstream src;
ofstream dst;

unsigned long line_number;

unsigned long replace_line_number=3;
char *replace_with="die 3. Zeile sollte durch diesen Text ersetzt werden";

char *line;
line=new char[10000]; //10000 ist ein willkuerlich gewaehlter Wert, aber deine Datei hat wohl keine Zeile mit mehr als 9999 Zeichen!?
if (line==0)
{
return(1);
}

src.open("input.txt");
dst.open("output.txt");

for(line_number=1;src.good();line_number++)
{
src.getline(line,10000);

if (line[0]=='#')
{
//was soll hier eigentlich gemacht werden?
strcat(line," - diese Zeile beginnt mit #");
}

if (strstr(line,"bla"))
{
strcpy(line,"diese Zeile wurde ersetzt"); //der Text durch den ersetzt wird, darf natuerlich nicht mehr als 9999 Zeichen haben!
}

if (line_number==replace_line_number)
{
strcpy(line,replace_with);
}

dst.write(line,strlen(line));
dst.put('\n');
}

src.close();
dst.close();

delete [] line;

return(0);
}

anda_skoa
02-06-2003, 14:59
In C++ könntest du auch mit C++ Strings arbeiten.
Dann ist die Länge der Zeile egal.



// ...
#include <string>
// ...

string line;
getline(src, line);


std::string bietet auch eine Reihe von Methoden zum Suchen im String.

Ciao,
_

BLUESCREEN3D
02-06-2003, 18:11
hmm... hast recht :D

BLUESCREEN3D
02-06-2003, 22:37
ungetestete version mit der string-klasse:



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

using namespace std;

int main()
{
ifstream src;
ofstream dst;

unsigned long line_number;

unsigned long replace_line_number=3;
string replace_with="die 3. Zeile sollte durch diesen Text ersetzt werden";
string line;
int read_character;

src.open("input.txt");
dst.open("output.txt");

for(line_number=1;src.good();line_number++)
{
//hier kann man wohl nicht mehr die getline-funktion benutzen!?
line="";
while(((read_character=src.get())!=-1) && (read_character!='\n'))
{
line+=read_character;
}

if (line.at(0)=='#')
{
//was soll hier eigentlich gemacht werden?
line+=" - diese Zeile beginnt mit #";
}

if (line.find("bla"))
{
line="diese Zeile wurde ersetzt";
}

if (line_number==replace_line_number)
{
line=replace_with;
}

dst.write(line.c_str(),line.length());
dst.put('\n');
}

src.close();
dst.close();

return(0);
}

anda_skoa
03-06-2003, 11:03
Im <string> Header ist eine getline Funktion für std::string deklariert.
Hab das schon in meinem anderen Posting angedeutet.



getline(istream, string);


Ciao,
_

BLUESCREEN3D
03-06-2003, 12:03
Original geschrieben von anda_skoa
Im <string> Header ist eine getline Funktion für std::string deklariert.
Hab das schon in meinem anderen Posting angedeutet.



getline(istream, string);


irgendwie finde ich von der Funktion nur Definitionen mit streamsize als 2. Parameter!?
soll das dann so aussehen?:


line.getline(src,line);

anda_skoa
03-06-2003, 14:55
Original geschrieben von BLUESCREEN3D

soll das dann so aussehen?:


line.getline(src,line);


Nein, so wie ich schon geschrieben habe.
Mal ein Beispiel mit iostream



#include <string>
#include <iostream>

using namespace std;

int main()
{
string line;
getline(cin, line);

cout << line << endl;

return 0;
}


Ciao,
_

BLUESCREEN3D
03-06-2003, 15:56
für das proggi also so:
getline(src,line);

anda_skoa
03-06-2003, 15:59
Korrekt

Ciao,
_