Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Suchen unr ersetzen in Textdatei?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
26.10.2004, 12:14 Uhr
~_tobi_
Gast


Hallo Leute!

Bin mal wieder am Basteln an meine Grenzen gestossen und wollte mal fragen, ob einer von Euch nen guten Tipp für folgendes Problem hat:

Ich suche in einer Textdatei eine Zeile und möchte sie überschreiben, also zuerst such ich mir die Zeile, merk mir die Position, such noch ne Zeile (auch die Position merk ich mir), will nun den Dateizeiger an die erste (gemerkte) Position setzen und da was hinschreiben. Das Problem ist nur, dass er dann die nächste Zeile annimmt, und nicht die Zeile, in der er was gefunden hat. Warum? Oder kann ich fwrite() genau sagen, wohin er schreiben soll??

Hier der Code zur Verdeutlichung:


C++:
(...)
char *pKamSuche=NULL,*pSuchZeiger=NULL;
fpos_t ErstePos, ZweitePos;
pFile=fopen("D:\\Textdatei.txt","r+t");

while(fgets(szLine,255,pFile))
{
      pKamSuche = strstr(szLine,"K#");
      if(pKamSuche)
    fgetpos(pFile,&ErstePos);
      pSuchZeiger = strstr(szLine,"S#");
      if (pSuchZeiger)
     {
    fgetpos(pFile,&ZweitePos);
    ReturnCode = fsetpos(pFile,&ErstePos);
             ReturnCode = fwrite("text",sizeof(char),4,pFile);
     }            
}
(...)



Was mache ich nur falsch??

Tobi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.10.2004, 13:11 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


das ist sowieso nicht so ne gute idee...
am besten machst du ne zwischendatei auf und kopierst in diese die dinge der anderen datei in der reihenfolge wie du sie haben willst...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.10.2004, 13:31 Uhr
~_tobi_
Gast


naja, so einfach ist es dann doch nicht, weil mein suchbegriff weiter unten in der Datei steht - wenn ich ihn gefunden habe, brauche ich aber informationen, die "über" dem Suchbegriff stehen:

Bsp:

Textdateianfang
(..)
zugehörige Info
Suchbegriff
(..)
zugehörige Info
Suchbegriff
(..)
Textdateiende

Abhilfe würde auch schon schaffen, die Datei rückwärts einzulesen, doch wie macht man das?

Tobi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.10.2004, 13:38 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


muss es c sein oder geht auch c++?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
26.10.2004, 14:59 Uhr
~_tobi_
Gast


ist total egal.... warum?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
26.10.2004, 16:30 Uhr
0xdeadbeef
Gott
(Operator)


Etas in der Art?

C++:
#include <fstream>
#include <string>

// ...

std::ifstream in("input.txt");
std::ofstream out("output.txt");
std::string zeile;

while(std::getline(in, zeile)) {
  if(zeile == "was du suchst")
    out << "was raus soll" << std::endl;
  else
    out << zeile << std::endl;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
26.10.2004, 22:23 Uhr
~_tobi_
Gast


Nach vielen missglückten Versuchen nehm ich nun die CString- Klasse.... *heul*
Wenn das Prog fertig ist, kann ich es ja mal posten.. nur soviel zum Ablauf:

- Erst lese ich die ganze Datei in eine CString- Variable
Dabei hilft einem CStdioFile::ReadFile (NewLine- und CarriageReturns selber anhängen)
- suche dann mein Schlüsselwort
- schneide mit CString::Left() mir den "oberen" Teil heraus
- suche im oberen Teil "von hinten" CString::ReverseFind() meine Infos
- schneide mir passendes heraus
- füge neue Sachen hinzu
- bastel mir alles wieder in eine CString- Variable
- schreibe alles in eine Datei

Alle Positionen bzw. Längen merk ich mir mit strlen().

Das ganze geht bestimmt auch einfacher - nur wie das wissen andere...

Tobi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
27.10.2004, 11:04 Uhr
0xdeadbeef
Gott
(Operator)


Wenn du den Kram buffern willst, dann machs wenigstens richtig:

C++:
#include <fstream>
#include <iostream>
#include <string>
#include <vector>

int main() {
  std::ifstream in("datei.txt");
  std::string zeile;
  std::vector<std::string> datei_buffer

  while(std::getline(in, zeile)) // Zeile einlesen
    datei_buffer.push_back(zeile); // und hinten an den vector hängen

  // dann nachher auf die Zeilen wie in einem Array zugreifen:
  std::cout << datei_buffer[9] << std::endl; // 10. Zeile (Indices beginnen bei [0])
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
27.10.2004, 13:04 Uhr
Devil




Zitat von ~_tobi_:
Nach vielen missglückten Versuchen nehm ich nun die CString- Klasse.... *heul*
Wenn das Prog fertig ist, kann ich es ja mal posten.. nur soviel zum Ablauf:

- Erst lese ich die ganze Datei in eine CString- Variable
Dabei hilft einem CStdioFile::ReadFile (NewLine- und CarriageReturns selber anhängen)
- suche dann mein Schlüsselwort
- schneide mit CString::Left() mir den "oberen" Teil heraus
- suche im oberen Teil "von hinten" CString::ReverseFind() meine Infos
- schneide mir passendes heraus
- füge neue Sachen hinzu
- bastel mir alles wieder in eine CString- Variable
- schreibe alles in eine Datei

Alle Positionen bzw. Längen merk ich mir mit strlen().

Das ganze geht bestimmt auch einfacher - nur wie das wissen andere...

Tobi


Tu dir selbst den Gefallen und lern Standard C++, damit bleibst du immer
flexibel, und bist unabhängig von GUI Libs und Betriebssystemen.

Devil
--
Intelligenz ist eine Illusion des Menschen

Dieser Post wurde am 27.10.2004 um 13:05 Uhr von Devil editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
30.10.2004, 18:56 Uhr
~_tobi_
Gast


@devil:

Ja, eigentlich hast du recht; dieses Mischmasch irritiert mich selber .... Aber verführerisch ist es schon, einfach alles zusammen zu drehen, um zu schnellen Ergebnissen zu kommen; ich werde mich wohl wieder weiter meinen Lektüren widmen und natürlich diesem helfendem Forum.

Danke

Tobi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: