Text Datei einlesen
-
Ich hab da ein kleines Problem. Ich bin c++ Anfänger und möchte eine txt.Datei einlesen, die folgendes Muster aufweist:
NUMOFF;MAT ; 1 NUMOFF;TYPE; 2 *ENDIF *SET;ASMDIAG ; 6,524972293504 *SET;_STATUS ; 1,000000000000 DOF;DELETE ET; 1;186 KEYOP; 1; 2; 1 NBLOCK;6;SOLID (3i8;6e16,9) 1 0 0 -36,6508010 -545,339752 437,072622 2 0 0 -36,8394628 -544,954056 437,041374 3 0 0 -36,4580822 -545,288083 436,546817 4 0 0 -36,6467441 -544,902388 436,515568 5 0 0 -36,4421463 -545,236913 437,082204 6 0 0 -36,6308081 -544,851217 437,050956 7 0 0 -35,9712286 -544,996273 437,209234 8 0 0 -36,1598905 -544,610577 437,177986 9 0 0 -35,8484075 -544,921434 437,391444 10 0 0 -36,0370694 -544,535738 437,360196 11 0 0 -35,7385724 -544,853862 437,562345 12 0 0 -35,9272343 -544,468166 437,531097 1889 0 0 -37,8879077 -546,394077 437,459104 1890 0 0 -34,3209064 -544,649362 437,458227 N;R5,3;LOC; -1; EBLOCK;19;SOLID; 464 (19i8) 1 1 1 1 0 0 573 521 1776 570 1297 1271 1 1 1 1 0 0 570 1776 521 573 572 1774 CMBLOCK;C0 ;NODE; 375 ! users node component definition (8i10) 313 314 315 316 317 318 319 321 322 323 324 325 326 327 329 330 331 332 333 334 335 1720 1721 1722 1723 1724 1725 1726 1728 1729 1730 1731 1732 1733 1734Ich würde gerne dabei die einzelnen Zahlen, die in Zeile 11-24, 28-31 und 35-39 als Variablen abspeichern, da ich damit weiterrechnen muss.
Da ich Dateien leider noch nie einlesen habe und es scheinbar eine Menge Möglichkeiten gibt, wie man so etwas machen könnte, bin ich ziemlich durcheinander und weiß keinen sinnvollen Ansatz. Ich hoffe, ihr könnt mir helfen?!
-
ich würds zeilenweise lesen, nach dem ausdruck "BLOCK" in jeder zeile suchen, 2 zeilen weiterspringen und dann zeile für zeile immer in strings lesen und mit
string line; string wert; int wAnf = find_first_of_not("\t "); // Backslash und Leerzeichen sind trennzeichen in der Datei nehm ich mal an! int wEnd = line.size(); line = line.substr(wAnf, line.size()); while (wAnf != npos && wEnd != npos) { wEnd = line.find_first_of("\t "); wert = line.substr(wAnf,wEnd); line = line.substr(wEnd, line.size()); wAnf = line.find_first_of_not("\t "); } //den string wert kannste mit scanf parsen
-
Hab jetzt mal versucht mit dem Quellcode die Zeilen 11-24 einzulesen.
main() { ifstream fin("text.txt"); string str; string strDelimiter = " "; // Trennzeichen // Zerlegung von "str" und Ablage der Teilstrings in "tokens" vector<string> tokens ; while (fin.eof() != true) { getline(fin, str); cout << "line:"<< str<< endl; string::size_type nLastPos = str.find_first_not_of(strDelimiter, 0); string::size_type nPos = str.find_first_of(strDelimiter, nLastPos); while( nPos != string::npos || nLastPos != string::npos ) { tokens.push_back(str.substr(nLastPos, nPos - nLastPos)); nLastPos = str.find_first_not_of(strDelimiter, nPos); nPos = str.find_first_of(strDelimiter, nLastPos); } } fin.close(); return 0; }Beim compilieren bekomme ich allerdings 4 Warnungen.
Temporäre Dateien und Ausgabedateien für "fileProbe2cdbTest1 - Win32 Debug" werden gelöscht. --------------------Konfiguration: fileProbe2cdbTest1 - Win32 Debug-------------------- Kompilierung läuft... StdAfx.cpp Kompilierung läuft... fileProbe2cdbTest1.cpp D:\Studium\Diplomarbeit\Kombinationstool\file_Probe2.cdb.txt Einlesen\fileProbe2cdbTest1\fileProbe2cdbTest1.cpp(61) : warning C4786: 'std::reverse_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,std::basic_strin g<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,int>' : Bezeichner wurde auf '255' Zeichen in den Debug-Informationen reduziert D:\Studium\Diplomarbeit\Kombinationstool\file_Probe2.cdb.txt Einlesen\fileProbe2cdbTest1\fileProbe2cdbTest1.cpp(61) : warning C4786: 'std::reverse_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > *,std::basic_string<char ,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> > &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > *,int>' : Bezeichner wurde auf '255' Zeichen in den Debug-Info rmationen reduziert c:\programme\microsoft visual studio\vc98\include\vector(47) : warning C4786: 'std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >:: vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >' : Bezeichner wurde auf '255' Zeichen in den Debug-Informationen verkürzt c:\programme\microsoft visual studio\vc98\include\vector(60) : warning C4786: 'std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >:: ~vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >' : Bezeichner wurde auf '255' Zeichen in den Debug-Informationen verkürzt Linker-Vorgang läuft... fileProbe2cdbTest1.exe - 0 Fehler, 4 Warnung(en)Ich kann damit nichts anfangen. Habt ihr da eine Idee?
-
Die warning C4786 kannst Du beim VC6 ignorieren. Am besten Du schaltest sie mit einem
#pragma warning ( disable : C4786 )einfach ab.
Der Anfang von dem Code zum Einlesen könnte so aussehen:
#include <iostream> #include <string> #include <vector> #include <fstream> struct Record { friend std::istream& operator>>( std::istream& in, Record& r_ ) { Record r; if( in >> r.m_i[0] >> r.m_i[1] >> r.m_i[2] >> r.m_f[0] >> r.m_f[1] >> r.m_f[2] ) r_ = r; return in; } int m_i[3]; double m_f[3]; }; int main() { using namespace std; ifstream fin("text.txt"); fin.imbue( locale("german") ); // wegen ',' als Dezimaltrenner! for( int i=0; i<10; ++i ) // ersten 10 Zeilen überlesen fin.ignore( 9999, '\n' ); vector< Record > records; Record r; for( int j=0; j<14 && fin >> r; ++j ) // Records der Zeilen 11-24 records.push_back( r ); // usw. return 0; }Gruß
Werner
-
Werner Salomon schrieb:
Die warning C4786 kannst Du beim VC6 ignorieren. Am besten Du schaltest sie mit einem
#pragma warning ( disable : C4786 )einfach ab.
Das hab ich probiert, geht aber nicht.
Ich versuche gerade mal eine txt.Datei einzulesen mit folgendem Inhalt:
1 0 0 -36.6508010 -545.339752 437.072622Mit dem Quelltext:
ifstream datein; datein.open("C:\\Daten.txt"); int a, b, c; double d, e, f; datein >> a >> b >> c >> d >> e >> f; ofstream datauss; datauss.open("C:\\Ausgabe.txt"); datauss << a << " " << b << " " << c << " " << d << " " << e << " " << f; datauss.close(); datein.close();Die Ausgabe sieht allerdings so aus:
1 0 0 -36.6508 -545.34 437.073Er schreibt mir also nicht alle Nachkommastellen aus. Hab es schon mit atoi() und atof() probiert, geht aber auch nicht. Vielleicht mache ich aber auch was falsch.
-
sestefanhome schrieb:
Werner Salomon schrieb:
Die warning C4786 kannst Du beim VC6 ignorieren. Am besten Du schaltest sie mit einem
#pragma warning ( disable : C4786 )einfach ab.
Das hab ich probiert, geht aber nicht.
sicher geht das. Ich habe gesehen, dass Du eine stdafx.h verwendest. Wenn Du das #pragma vor das erste #include in der stdafx.h einfügst; spätestens dann sollte die warning weg sein.
sestefanhome schrieb:
Ich versuche gerade mal eine txt.Datei einzulesen mit folgendem Inhalt:
1 0 0 -36.6508010 -545.339752 437.072622Die Ausgabe sieht allerdings so aus:
1 0 0 -36.6508 -545.34 437.073Er schreibt mir also nicht alle Nachkommastellen aus. Hab es schon mit atoi() und atof() probiert, geht aber auch nicht. Vielleicht mache ich aber auch was falsch.
Nein Du machst nicht falsch. Bei der Ausgabe wird die eingestellte Ausgabe-Genauigkeit von 6 Dezimalstellen hergenommen. Wenn Du mehr haben willst, so musst Du das angeben:
dataus << setprecision(9); // setze Ausgabe auf 9 Dezimalstellen datauss << a << " " << b << " " << c << " " << d << " " << e << " " << f;Wichtig: das hat mit der internen Genauigkeit der double-Werte NICHTS zu tun.
Gruß
Werner
-
Werner Salomon schrieb:
Nein Du machst nicht falsch. Bei der Ausgabe wird die eingestellte Ausgabe-Genauigkeit von 6 Dezimalstellen hergenommen. Wenn Du mehr haben willst, so musst Du das angeben:
dataus << setprecision(9); // setze Ausgabe auf 9 Dezimalstellen datauss << a << " " << b << " " << c << " " << d << " " << e << " " << f;Wichtig: das hat mit der internen Genauigkeit der double-Werte NICHTS zu tun.
ah, danke. Darauf bin ich irgendwie nicht gekommen
Werner Salomon schrieb:
sestefanhome schrieb:
Werner Salomon schrieb:
Die warning C4786 kannst Du beim VC6 ignorieren. Am besten Du schaltest sie mit einem
#pragma warning ( disable : C4786 )einfach ab.
Das hab ich probiert, geht aber nicht.
sicher geht das. Ich habe gesehen, dass Du eine stdafx.h verwendest. Wenn Du das #pragma vor das erste #include in der stdafx.h einfügst; spätestens dann sollte die warning weg sein.
Wenn ich dich richtig verstehe, soll ich dass mal so machen:
#pragma warning ( disable : C4786 ) #include "stdafx.h" #include<vector> using namespace std; int main() { vector<string>tokens; return 0; }Dann bekomme ich aber immer noch 4 Warnmeldungen.
-
sestefanhome schrieb:
Wenn ich dich richtig verstehe, soll ich dass mal so machen:
#pragma warning ( disable : C4786 ) #include "stdafx.h" #include<vector> using namespace std; int main() { vector<string>tokens; return 0; }Dann bekomme ich aber immer noch 4 Warnmeldungen.
Sollte zwar auch gehen; gemeint habe ich aber IN der Datei stdafx.h; also nur einmal im Projekt - egal wie viele cpp-Dateien drin sind. Und anschließend 'rebuild all' aufrufen.
Gruß
Werner
-
Die Warning schaltet man aus indem man nur die Nummer angibt OHNE C davor
also so
#pragma warning ( disable : 4786 )und nicht so
#pragma warning ( disable : C4786 )
-
schokomann schrieb:
Die Warning schaltet man aus indem man nur die Nummer angibt OHNE C davor
.. wo der Schokomann Recht hat da hat der Recht. Das kommt davon, wenn man eine Zeile Code postet, ohne es vorher auszuprobieren - sei sie auch noch so trivial.
Danke für den Hinweis & Gruß
Werner
-
ah, danke!!! Habs jetzt in der Datei stdafx.h eingefügt. Jetzt geht es auch. Vielen Dank nochmal. Selbst wäre ich da wahrscheinlich nicht darauf gekommen
-
Hi Werner,
kann ja mal passieren.

Grundsätzlich gilt:
- Der Kompiler hat immer Recht.
- Der Bug sitzt immer vor dem Bildschirm.Gruß
schokomann
-
Ceos schrieb:
ich würds zeilenweise lesen, nach dem ausdruck "BLOCK" in jeder zeile suchen, 2 zeilen weiterspringen und dann zeile für zeile immer in strings lesen und mit
string line; string wert; int wAnf = find_first_of_not("\t "); // Backslash und Leerzeichen sind trennzeichen in der Datei nehm ich mal an! int wEnd = line.size(); line = line.substr(wAnf, line.size()); while (wAnf != npos && wEnd != npos) { wEnd = line.find_first_of("\t "); wert = line.substr(wAnf,wEnd); line = line.substr(wEnd, line.size()); wAnf = line.find_first_of_not("\t "); } //den string wert kannste mit scanf parsenWie sucht man denn nach dem Ausdruck "Block" und springt dann zwei Zeilen weiter?