dateien einlesen und in string umwandeln



  • muh,
    mein erster post ^^

    also folgendes:
    ich will programm in c++ schreiben das eine textdatei einliest und dann
    gewissen teile löscht und dann in eine neue textdatei speichert.
    ich habs im prinzip auch schon hinbekommen, aber da ich jeden buchstaben einzeln einlese hab ich am schluss nur einen string von einem buchstaben.

    frage wie bekommme ich es hin das alle buchstaben (bis auf die die gelöscht werden sollen) am schluss auch rauskommen?

    hier der code:

    include <iostream>
    #include <string>
    #include <fstream>
    
    using namespace std;
    	int main()
    	{
    		char zeichen;
    		ifstream dat_ein;
    		string dateiname;
    		int pos;
    		string ausgabe;
    
    		//-------------------------------------------
    		//Datei einlesen ANFANG
    		cout <<"Dateiname mit Pfadangabe(C:\\beispiel.txt): "; cin >>dateiname;
    
    		dat_ein.open( dateiname.c_str(), ios::in);
    
    		while(!dat_ein.eof())
    		{
    			dat_ein.get(zeichen);
    
    			dat_ein >>ausgabe; //heir soll der text in den string "ausgabe" übergeben werden
    		}
    
    		dat_ein.close();
    		//Datei einlesen ENDE
    		//--------------------------------------------
    
    		pos = ausgabe.find(":", 0); //zeichen finden das gelöscht werden soll
    		ausgabe.erase(0, pos+1);	//löschen des zeichens + ein weiteres zeichen (+1)
    
    		cout <<ausgabe <<endl;
    
    	}
    

    schon mal danke an alle hilfreichen posts 😃



  • So in der Art?

    #include <fstream>
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main() {
      char c;
      ifstream dat_ein;
    
      cout << "Dateiname mit Pfadangabe(C:\\beispiel.txt): ";
      cin >> dateiname;
    
      dat_ein.open(dateiname, ios::in);
    
      while(dat_ein.get(c))
        if(c != ':')
          cout.put(c);
    }
    


  • jo danke das hat zur lösung geführt
    is zwar wahrscheinlich ziemlich unelegant aber was solls...
    hauptsache es funktioniert 😃



  • noch eine frage:

    warum kann ich in den if bedingungen nicht mehrere zeichen mit || verbinden und dann vergleichen?
    also z.B:

    if(zeichen != 'a' || 'b')
    

    das kompilieren klappt zwar, aber dann wird weder 'a' noch 'b' rausgefilter.



  • eddi53 schrieb:

    if(zeichen != 'a' || 'b')
    

    ich denke du meinst

    if(zeichen != 'a' && zeichen != 'b')
    


  • jo, das meinte ich

    vielen dank



  • das programm erfüllt jetzt zwar seine aufgabe, aber leider tut es das viel zu gut

    die ursprüngliche idee war das ich die zeilenangaben und das : aus cpp beispielen löschen.
    dazu wollte ich den code einlesen und dann alles bis zum ":" zeichen lösche
    (siehe erster post), aber da ich das jetzt nicht mehr so mache sondern halt mit

    if (zeichen != '1' && zeichen != '2' ...)
    

    werden alle zeichen rausgefiltert, auch die nach dem ":"

    in sofern brauche ich den ansatz mit (siehe erstes posting für mehr details)

    pos = ausgabe.find(":", 0); 
    ausgabe.erase(0, pos+1);
    

    aber wie ich alle zeichen aus "zeichen" in "ausgabe" bekomme weiss ich nicht.

    wieso funktioniert das nicht mit (siehe erstes posting für mehr details)

    dat_ein >>ausgabe;
    

    dabei müsste doch jedes zeichen an "ausgabe" übergeben werden 😕

    *aufhilfewart* 😋



  • Meinst du sowas in der Art?

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main(int argc, char* argv[])
    {
            ifstream infile(argv[1]);
            ofstream outfile(argv[2]);
            if(infile.is_open())
            {
                    string str;
                    while(getline(infile, str))
                    {
                            unsigned int pos = str.find(":");
                            if(pos != string::npos)
                                    str.erase(0, pos + 1); // loescht bis zum ':'
    
                            outfile << str << endl; // Schreibt den 'modifizierten' string in outfile
                    }
            }
            return 0;
    }
    

    Caipi



  • Ich würd für solche Dinge nicht zu C++, sondern zu sed greifen - wenn du Linux oder ein UNIX-Derivat laufen hast, ist es wahrscheinlich schon dabei, für Windows gibts das z.B. bei Cygwin.

    Das Ding benutzt regular expressions, perl hat die sed-Syntax später übernommen. In deinem Fall sähe das sed-skript dann so aus:

    s/^[^:]*://g
    

    Sieht kryptisch aus, ist aber eigentlich ziemlich logisch. s/foo/bar/g ersetzt alle Vorkommen von foo durch bar. ^ ist der Zeilenanfang, [^abc] matcht alles außer a, b oder c, : ist ein Doppelpunkt. a* bedeutet eine beliebige Anzahl as. [:]*: matcht also alles vom Zeilenanfang bis zum ersten Doppelpunkt.



  • @0xdeadbeef
    sed scheint wirklich gut für sowas geeignet, aber da ich c++ lernen will würde mir das natürlich nicht ganz so viel bringen ^^

    @caipi

    bin anfänger und hab noch nicht mit pointern gearbeitet, aber wird wohl zeit sich damit zu beschäftigen

    der code sieht vielversprechend aus, aber wie sag ich 'ihm' das ich z.B. meine testdatei c:\z.txt bearbeiten will?

    ich hab versucht

    cout <<"Dateiname mit Pfadangabe(C:\\beispiel.txt): "; cin >>infile;
            if(infile.is_open())
    

    da einzufügen aber das bringt nur errors

    dann hab ich mir gedacht das infile ja garnicht geöffnet wird und noch

    infile.open( infile, ios::in);
    

    hingeschrieben, aber davon wurde es auch nicht besser

    wie mache ich es also ohne error?



  • Rufe das Programm aus der Konsole folgendermaßen auf:

    programmname.exe zu_lesende_datei zu_schreibende_datei
    

    Die "zu_lesende_datei" wird nun ausgelesen und entsprechend ohne dem Teil bis zum ':' in "zu_schreibende_datei" gespeichert.

    Das was ich da verwendet habe (was dir eventuell noch neu ist), ist, dass ich der main()-Funktion Argumente aus der Konsole mitgebe. (Siehe eventuell auch Argumente aus der Konsole o.ä.)

    Ansonsten kannst du es auch so schreiben:

    int main()
    {
          cout << "\n Bitte Datei eingeben, aus der gelesen werden soll: ";
          string infilename;
          getline(cin, infilename);
          cout << "\n Bitte Datei eingeben, in die geschrieben werden soll: ";
          string outfilename;
          getline(cin, outfilename);
    
          ifstream infile(infilename.c_str());
          ofstream outfile(outfilename.c_str());
    
          // ... Rest aus meinem vorigen Post
    
          return 0;
    }
    

    Caipi



  • *freu* funktioniert wunderbar 😃

    danke für deine besonderen mühen caipi und natürlich auch allen anderen die hier gepostet haben 🙂


Anmelden zum Antworten