Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Daten ab bestimmter Pos einlesen??

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 < [ 2 ]
000
07.05.2006, 11:20 Uhr
fruitbat



Hallo! bin noch blutiger Anfänger und bräucht deshalb etwas Hilfe.
Ich möchte eine Datei auslesen, aber nur ab einer bestimmten Anfangsposition (ab einem gewissen Wort/String) und auch nur bis zu einer gewissen Position lesen. Alles was zwischen den beiden Schlagworten steht, möchte ich dann in eine andere Datei (txt) schreiben.

Wie mache ich das am besten? Weil ich den ausgewählten Bereich später noch weiter sortieren und bearbeiten möchte, dachte ich das alles zeilenweise in einen Vektor zu kopieren.

Aber erstmal würd ich nur gern wissen, wie ich angebe, dass erst ab einem gewissen Wort gelesen wird/ bis zu einem bestimmten Wort..

Würd mich über Tipps freuen!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.05.2006, 11:41 Uhr
~MartinF
Gast



C++:
#include <iostream>
#include <vector>
#include <string>
#include <iterator>
#include <fstream>
using namespace std;


int main()
{
  typedef vector<string> vec_type;
  vec_type vec;

  ifstream fin("test.txt");
  istream_iterator<string> ii(fin);
  istream_iterator<string> eos;

  copy(ii, eos, back_inserter(vec));
  vec_type::const_iterator b=find(vec.begin(), vec.end(), "wort_von");
  vec_type::const_iterator e=find(vec.begin(), vec.end(), "wort_bis");

  ofstream fout("test_out.txt", ios_base::out);
  copy(b+1, e, ostream_iterator<string>(fout, " "));
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.05.2006, 09:09 Uhr
fruitbat



Hmm, wenn ich das übernehme tauchen folgende drei Fehler auf:

Compiling...
converter.cpp
DExamples\Converter\converter.cpp(19) : error C2065: 'find' : undeclared identifier
DExamples\Converter\converter.cpp(19) : error C2440: 'initializing' : cannot convert from 'int' to 'const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
DExamples\Converter\converter.cpp(20) : error C2440: 'initializing' : cannot convert from 'int' to 'const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.

converter.obj - 3 error(s), 0 warning(s)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.05.2006, 10:09 Uhr
0xdeadbeef
Gott
(Operator)


Vorne noch

C++:
#include <algorithm>


dran. Allerdings ist die Methode insofern suboptimal, als dass Formatierungen dabei verloren gehen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 08.05.2006 um 10:10 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.05.2006, 11:11 Uhr
fruitbat



ist zwar unschön, dass keine Formatierung mehr vorhanden ist, aber ist immerhin der richtig Ansatz.
Danke :-)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.05.2006, 11:31 Uhr
0xdeadbeef
Gott
(Operator)


Das hier ist die Holzhammer-Methode: Datei in einen String einlesen, dann darin suchen und das dazwischen ausgeben. Kann bei großen Dateien aber unpraktisch sein.

C++:
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <string>

int main(int argc, char *argv[]) {
  if(argc != 4) return -1;

  std::ifstream in(argv[1]);

  in.unsetf(std::ios::skipws);

  std::string start_mark(argv[2]);
  std::string end_mark(argv[3]);
  std::string buf;

  std::copy(std::istream_iterator<char>(in),
            std::istream_iterator<char>(),
            std::back_inserter(buf));

  std::string::size_type start_pos = buf.find(start_mark) + start_mark.size();
  std::string::size_type end_pos   = buf.find(end_mark, start_pos);

  std::copy(buf.begin() + start_pos,
            buf.begin() + end_pos,
            std::ostream_iterator<char>(std::cout, ""));
}


Das Programm hier nimmt als ersten Parameter die Datei, als zweiten das startwort und als dritten das endwort entgegen, das kann aber auch fest eingedrahtet werden.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.05.2006, 09:51 Uhr
fruitbat



Da ist sehr große Dateien habe, möcht ich schon bei Vektoren bleiben.
Danke trotzdem!

Die Frage ist jetzt aber noch, wie ich innerhalb des ausgewählten Bereichs ein String finde?

die Datei einthält bsplw so etwas
-Name="NameDerDatei";

und das mehrmals.

Ausgeben möchte ich alle Dateinamen.

-ich habe versucht in dem vektor wieder einen kleinen bereich einzugrenzen und es auszugeben. Dabei kam aber nie ein String sondern immer eine Zahl raus.

Wäre es schöner anstelle von find() mit search() zu suchen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.05.2006, 09:58 Uhr
fruitbat



Jetzt habe ich mal was neues geschrieben, aber wird jedes einzelen Wort des Vektors ausgeben.

sieht so aus:

if(vec_type::iterator res=find(vec.begin(), vec.end(), "name="))
{
for(res = vec.begin(); res < vec.end(); res++){
cout << "FileName is: " << *res << '\n';
}
}

was mache ich falsch?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
09.05.2006, 17:51 Uhr
~MartinF
Gast



Zitat:

Da ist sehr große Dateien habe, möcht ich schon bei Vektoren bleiben.
Danke trotzdem!



Wo ist der Unterschied, ob die Zeichen (chars) in Form eines Containers wie Vector oder in Form eines Strings speicherst. Es wird so weit ich weiß die gleiche Menge an Speicher verbraucht. Vlt. ist der Speicherverbrauch bei der Variante mit String ein klein wenig höher, dies sollte aber bei einem derartig kleinem Programm kaum auffallen. Ich finde die Variante mit dem String auch schöner, da die WCs (Leerzeichen, etc.) nicht übersprungen werden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
09.05.2006, 18:32 Uhr
fruitbat



okay, aber diese Version wirft immer folgenden Fehler bei mir, weshalb ich mich dann lieber immer um die andere Variante gekümmert hab

Compiling...
converter.cpp
cprogramme\microsoft visual studio\vc98\include\iterator(82) : error C2039: 'push_back' : is not a member of 'basic_string<char,struct std::char_traits<char>,class std::allocator<char> >'
cprogramme\microsoft visual studio\vc98\include\iterator(82) : while compiling class-template member function 'class std::back_insert_iterator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > &__thi
scall std::back_insert_iterator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >::operator =(const char &'
Error executing cl.exe.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: