Text Datei einlesen



  • 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.072622
    

    Mit 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.073
    

    Er 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.072622
    

    Die Ausgabe sieht allerdings so aus:

    1 0 0 -36.6508 -545.34 437.073
    

    Er 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 parsen
    

    Wie sucht man denn nach dem Ausdruck "Block" und springt dann zwei Zeilen weiter?


Anmelden zum Antworten