none
Fehler beim Oeffnen der Datei! beim Versuch, eine CSV Datei zu lesen RRS feed

  • Frage

  • ….nächstes Problem:

    Er liest das File nicht ein, obwohl es im richtigen Format vorhanden ist.

    Ich bekommme die Fehlermeldung:

    Fehler beim Oeffnen der Datei!


    Hier ist der Code:

    #include "stdafx.h"
    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std; 
    
    struct Person
    {
    	string vname;
    	string nname;
    	string alter;
    	string geschlecht;
    };
    
    istream& lese_ein(istream& in, Person& p)
    { getline(in, p.vname, ';'); getline(in, p.nname, ';'); getline(in, p.alter, ';'); getline(in, p.geschlecht, '\n'); return in; } int main() { ifstream csvread("Namen2.csv"); if (!csvread.is_open()) cerr << "Fehler beim Oeffnen der Datei!" << endl; else { for (Person person; lese_ein(csvread, person); ) { cout << person.vname << endl; cout << person.nname << endl; cout << person.alter << endl; cout << person.geschlecht << endl; getchar(); } } return 0; }

    Das File Namen2.csv sieht wie folgt aus:

    Max;Mustermann;18;m
    Rolf;Schuster;34;m
    Anna;Kluge;23;w

    Hat jemand eine Idee?

    Gruß

    Berni
    • Geteilt Stefan Falz Mittwoch, 3. Mai 2017 06:28 C++ Frage
    Sonntag, 30. April 2017 09:43

Antworten

  • Hallo,

    wenn die Datei nicht geöffnet werden kann, hat er sie nicht gefunden. Die Datei muss im gleichen Verzeichnis sein wie das Programm.

    Wenn die Datei dann geöffnet werden kann, kommt er aber in eine Endlosschleife. Ändere die Funktion lese_ein ein wenig ab:

    bool lese_ein(istream& in, Person& p)
    {
      if (!getline(in, p.vname, ';')) return false;
      if (!getline(in, p.nname, ';')) return false;
      if (!getline(in, p.alter, ';')) return false;
      if (!getline(in, p.geschlecht, '\n')) return false;
      return true;
    }

    Wofür brauchst du das getchar in der for-Schleife? Damit unterbrichst du doch nur das Einlesen.

    Gruß Guido


    Mittwoch, 3. Mai 2017 06:09
  • Wenn ich das richtig verstehe, sind in der Einlese-Datei nur Daten, keine Überschrift? Dann muss die erste Zeile in der Einlesedatei mit gespeichert werden.

    Um die Überschrift in die Ausgabedatei dann zu machen, kann man auch das alte nehmen und die Überschrift vor der Schleife speichern.

    	schreibe_ueberschrift(cswrite);
    	while (lese_ein(csvread_l, daten))
    	{
    // in Standard-Ausgabe anzeigen (nur auf dem Bildschirm)
    		cout << daten.str_OBJ_KONST << endl;
    		cout << daten.str1 << endl;
    		cout << daten.str2 << endl;
    		cout << daten.str3 << endl;
    		cout << daten.str4 << endl;
    		cout << daten.str5 << endl;
    		cout << daten.str6 << endl;
    		cout << daten.str7 << endl;
    
    // in die Datei speichern
       		schreibe_aus(cswrite, daten);
    	}    

    Freitag, 12. Mai 2017 12:44

Alle Antworten

  • Hallo,

    wenn die Datei nicht geöffnet werden kann, hat er sie nicht gefunden. Die Datei muss im gleichen Verzeichnis sein wie das Programm.

    Wenn die Datei dann geöffnet werden kann, kommt er aber in eine Endlosschleife. Ändere die Funktion lese_ein ein wenig ab:

    bool lese_ein(istream& in, Person& p)
    {
      if (!getline(in, p.vname, ';')) return false;
      if (!getline(in, p.nname, ';')) return false;
      if (!getline(in, p.alter, ';')) return false;
      if (!getline(in, p.geschlecht, '\n')) return false;
      return true;
    }

    Wofür brauchst du das getchar in der for-Schleife? Damit unterbrichst du doch nur das Einlesen.

    Gruß Guido


    Mittwoch, 3. Mai 2017 06:09
  • Hallo Guido,

    mal wieder besten Dank für die gute Antwort!

    Das Einlesen läuft jetzt einwandfrei. getchr habe ich gesperrt.

    Nun habe ich einen Versuch gemacht das ganze wieder auf ein neues File zu schreiben.

    Eigentlich müsste er doch zumindest mal das File "speichern.txt" anlegen, macht er aber nicht?

    Hier ist der Code:

    #include "stdafx.h"
    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std; 
    
    struct DatenCSV
    {
    	string str1;
    	string str2;
    	string str3;
    	string str4;
    	string str5;
    };
    
    
    	bool lese_ein(istream& in, DatenCSV& p)
    	{
    	if (!getline(in, p.str1, ';')) return false;
    	if (!getline(in, p.str2, ';')) return false;
    	if (!getline(in, p.str3, ';')) return false;
    	if (!getline(in, p.str4, ';')) return false;
    	if (!getline(in, p.str5, '\n')) return false;
    	return true;
    	}   
    	
    
    
    
    
    int main()
    {
    	ifstream csvread("cisco-serial-1.csv");
    	if (!csvread.is_open())
    		cerr << "Fehler beim Oeffnen der Datei!" << endl;
    	else {
    		for (DatenCSV daten; lese_ein(csvread, daten); ) { 
    			cout << daten.str1 << endl;
    			cout << daten.str2 << endl;
    			cout << daten.str3 << endl;
    			cout << daten.str4 << endl;
    			cout << daten.str5 << endl;
    //			getchar();     
    		}     // gehört zur for-Schleife
    	}
    
    //-----------------------------------------------------------
    //      A b s p e i c h e r n
    //-----------------------------------------------------------
    
    	std::ifstream file;
    	file.open("speichern.txt");
    	std::string gelesen;
    
    	while (file >> gelesen)
    	{
    		std::cout << gelesen << std::endl;
    	}
    	file.close();
    
    
    
    
    	return 0;
    }

    Gruß

    Berni

    Freitag, 5. Mai 2017 06:37
  • ...hallo,

    hier eine neue Version zum Abspeichern, funktioniert aber auch noch nicht, obwohl er ohne Fehler durchläuft.

    Er müsste doch die Datei dort anlegen, wo er die andere Datei einliesst?

    #include "stdafx.h"
    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std; 
    
    struct DatenCSV
    {
    	string str1;
    	string str2;
    	string str3;
    	string str4;
    	string str5;
    };
    
    /*  istream& lese_ein(istream& in, DatenCSV& p) 
    {
    	getline(in, p.str1, ';');
    	getline(in, p.str2, ';');
    	getline(in, p.str3, ';');
    	getline(in, p.str4, ';');
    	getline(in, p.str5, '\n');
    	return in;
    	}
    	*/
    
    
    	bool lese_ein(istream& in, DatenCSV& p)
    	{
    	if (!getline(in, p.str1, ';')) return false;
    	if (!getline(in, p.str2, ';')) return false;
    	if (!getline(in, p.str3, ';')) return false;
    	if (!getline(in, p.str4, ';')) return false;
    	if (!getline(in, p.str5, '\n')) return false;
    	return true;
    	}   
    	
    
    
    
    
    int main()
    {
    	ifstream csvread_l("cisco-serial-1.csv");
    	if (!csvread_l.is_open())
    		cerr << "Fehler beim Oeffnen der Datei!" << endl;
    	else {
    		for (DatenCSV daten; lese_ein(csvread_l, daten); ) { 
    			cout << daten.str1 << endl;
    			cout << daten.str2 << endl;
    			cout << daten.str3 << endl;
    			cout << daten.str4 << endl;
    			cout << daten.str5 << endl;
    //			getchar();     
    		}     // gehört zur for-Schleife
    	}
    
    //-----------------------------------------------------------
    //      A b s p e i c h e r n
    //-----------------------------------------------------------
    
    	ifstream csvread_s("test.csv");
    	if (!csvread_s.is_open())
    		cerr << "Fehler beim Oeffnen der Datei!" << endl;
    	else {
    		for (DatenCSV daten; lese_ein(csvread_s, daten); ) { // <- was genau passiert bei: Person person?!
    			cout << daten.str1 << endl;
    			cout << daten.str2 << endl;
    			cout << daten.str3 << endl;
    			cout << daten.str4 << endl;
    			getchar();
    		}
    	}
    
    
    
    
    
    	return 0;
    }

    Gruß

    Berni

    Freitag, 5. Mai 2017 07:11
  • ...nochmal 'ne neue Version. Diesmal legt er schon das neue File an,
      aber die Daten werden noch nicht in das File geschrieben.

    #include "stdafx.h" #include <iostream> #include <fstream> #include <string> using namespace std; struct DatenCSV { string str1; string str2; string str3; string str4; string str5; }; bool lese_ein(istream& in, DatenCSV& p) { if (!getline(in, p.str1, ';')) return false; if (!getline(in, p.str2, ';')) return false; if (!getline(in, p.str3, ';')) return false; if (!getline(in, p.str4, ';')) return false; if (!getline(in, p.str5, '\n')) return false; return true; } bool schreibe_aus(istream& out, DatenCSV& p) { if (!getline(out, p.str1, ';')) return false; if (!getline(out, p.str2, ';')) return false; if (!getline(out, p.str3, ';')) return false; if (!getline(out, p.str4, ';')) return false; if (!getline(out, p.str5, '\n')) return false; return true; } int main() { ifstream csvread_l("cisco-serial-1.csv"); if (!csvread_l.is_open()) cerr << "Fehler beim Oeffnen der Datei!" << endl; else { for (DatenCSV daten; lese_ein(csvread_l, daten); ) { cout << daten.str1 << endl; cout << daten.str2 << endl; cout << daten.str3 << endl; cout << daten.str4 << endl; cout << daten.str5 << endl; // getchar(); } } //----------------------------------------------------------- // A b s p e i c h e r n //----------------------------------------------------------- ofstream cswrite("Text222.csv"); cswrite << "Dieser Text kommt in die Datei";

    // cout << schreiben.str1 << endl; // for (DatenCSV daten; schreibe_aus(schreiben, daten); ) { // for (DatenCSV daten; 1; ) { // cout << daten.str1 << endl; // } cswrite.close(); return 0; }

    Es sollen erstmal die gleichen Daten herausgeschrieben werden, wie sie auch eingelesen werden.

    Gruß

    Berni

    Freitag, 5. Mai 2017 09:50
  • Hallo,

    zunächst einmal wird jede Zeile nach dem Einlesen von dir nur nach cout ausgegeben. Danach sind die Daten weg.

    In deine cswrite wird gar nichts gespeichert, ausser dein Text "Dieser Text kommt in die Datei".

    In schreibe_aus hast du getline drin stehen. Damit liest du Daten ein, aber speicherst nichts weg.

    Wenn du die Daten von ifstream in ofstream speichern willst, gehört das in eine einzige Schleife.

    #include "stdafx.h"
    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std; 
    
    struct DatenCSV
    {
    	string str1;
    	string str2;
    	string str3;
    	string str4;
    	string str5;
    };
    
    
    bool lese_ein(istream& in, DatenCSV& p)
    {
    	if (!getline(in, p.str1, ';')) return false;
    	if (!getline(in, p.str2, ';')) return false;
    	if (!getline(in, p.str3, ';')) return false;
    	if (!getline(in, p.str4, ';')) return false;
    	if (!getline(in, p.str5, '\n')) return false;
    	return true;
    }   
    
    	
    void schreibe_aus(ostream& out, const DatenCSV& p)
    {
    	out << p.str1 << ';';
    	out << p.str2 << ';';
    	out << p.str3 << ';';
    	out << p.str4 << ';';
    	out << p.str5 << '\n';
    }  
    	
    
    
    
    
    int main()
    {
    	ifstream csvread_l("cisco-serial-1.csv");
    	ofstream cswrite("Text222.csv");
    	if (!csvread_l.is_open())
    	{
    		cerr << "Fehler beim Oeffnen der Datei!" << endl;
    		return 1;
    	}
    
    	if (!cswrite.is_open())
    	{
    		cerr << "Fehler beim Oeffnen der Ausgabe-Datei!" << endl;
    		return 2;
    	}
    
    	// Daten einlesen, auf cout ausgeben und in Datei speichern
    	DatenCSV daten;
    	while (lese_ein(csvread_l, daten))
    	{ 
    		// in Standard-Ausgabe anzeigen
    		cout << daten.str1 << endl;
    		cout << daten.str2 << endl;
    		cout << daten.str3 << endl;
    		cout << daten.str4 << endl;
    		cout << daten.str5 << endl;
    
    		// in die Datei speichern
    		schreibe_aus(cswrite, daten);
    	}    
    
    	cswrite.close();
    	csvread_l.close();
    
    	return 0;
    }
    
    
    Gruß, Guido

    Montag, 8. Mai 2017 07:08
  • Hallo Guido,

     

    mal wieder besten Dank!  Soweit läuft es schon ganz gut. Wenn ich die Reihenfolge der Spalten ändern möchte, dann kann ich das bei

    void schreibe_aus(ostream& out, const DatenCSV& p)

    {

           out << p.str3 << ';';

           out << p.str2 << ';';

           out << p.str6 << ';';

           out << p.str5 << ';';

           out << p.str7 << ';';

           out << p.str1 << ';';

           out << p.str4 << '\n';

    }

    machen, das funktioniert einwandfrei.

    Gerade habe ich das Problem, im Hauptprogramm (oben in der Deklaration geht das recht einfach) einem String einen festen Text zuzuweisen, z. B.

    str1 = “Fester Text“;

    so dass in einer Spalte im CSV-File ‘Fester Text‘ steht. Genauso weiß ich jetzt gerade nicht wie man aus einem der Strings (str1, str2, str3….) den Text ausließt, um ihn vergleichen zu können?

    C++ ist halt nicht so einfach….

     

    Ich denke es gibt eine Lösung, besten Dank,

    Gruß

     

    Berni

     

     

     

     

    Donnerstag, 11. Mai 2017 09:40
  • .....doch geht hier:

    bool lese_ein(istream& in, DatenCSV& p)
    {
        if (!getline(in, p.str1, ';')) return false;
        if (!getline(in, p.str2, ';')) return false;
        if (!getline(in, p.str3, ';')) return false;
        if (!getline(in, p.str4, ';')) return false;
        if (!getline(in, p.str5, ';')) return false;
        if (!getline(in, p.str6, ';')) return false;
        if (!getline(in, p.str7, '\n')) return false;


        if (p.str1 == "ZZX")
        {
            p.str1 = "C__OBJTYPE__ENCLOSURE";
        }

        return true;
    }

    ....ist halt C++.............

    Bis dahin....,

    Berni

    Donnerstag, 11. Mai 2017 11:36
  • Gerade habe ich das Problem, im Hauptprogramm (oben in der Deklaration geht das recht einfach) einem String einen festen Text zuzuweisen, z. B.

    str1 = “Fester Text“;

    so dass in einer Spalte im CSV-File ‘Fester Text‘ steht. Genauso weiß ich jetzt gerade nicht wie man aus einem der Strings (str1, str2, str3….) den Text ausließt, um ihn vergleichen zu können?

     

    Willst du nur einen String mit einem "festen Text" vergleichen? Du brauchst den Text aus str1, str2, ... nicht auslesen, der steht ja da drin, so wie du ihn mit getline zuvor eingelesen hast.

    Ein Vergleich geht einfach so: verwende den operator==

    if (str1 == "Fester Text") ...

    Gruß Guido

    Donnerstag, 11. Mai 2017 12:12
  • Hallo Guido,

     

    läuft jetzt schon richtig gut, kann die Spalten beliebig vertauschen, kann Strings einfügen wo ich will…alles so wie es sein soll.

    Bloß: Ich muss in die erste Zeile eine Überschrift einfügen und zwar für jede Spalte eine andere. Die Überschrift wird nicht eingelesen, sondern wie beim ‘Hersteller‘ oder bei den ‘Objektkonstanten‘ im Programm über  “Text“ zugewiesen.

    Beispiel:

    p.str_OBJ_KONST  = "C__OBJTYPE__SWITCH";

    p.str_Überschrift_Spalte1 = “Text 1. Spalte“;

    p.str_Überschrift_Spalte2 = “Text 2. Spalte“;

     

    Bloß, wie bekomme ich den String in die erste Zeile und entsprechende Spalte?? Schleifenzähler oder so was gibt’s ja hier nicht. Vielleicht eine extra Open-Anweisung machen?

     

    Ich füge nochmal den neuen Code mit bei:

     

    #include "stdafx.h"
    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    struct DatenCSV
    {
    	string str_OBJ_KONST; 
    	string str_Hersteller;
    
    	string str1;
    	string str2;
    	string str3;
    	string str4;
    	string str5;
    	string str6;
    	string str7;
    };
    
    
    bool lese_ein(istream& in, DatenCSV& p)
    {
    	if (!getline(in, p.str1, ';')) return false;
    	if (!getline(in, p.str2, ';')) return false;
    	if (!getline(in, p.str3, ';')) return false;
    	if (!getline(in, p.str4, ';')) return false;
    	if (!getline(in, p.str5, ';')) return false;
    	if (!getline(in, p.str6, ';')) return false;
    	if (!getline(in, p.str7, '\n')) return false;
    
    
    	if ((p.str2 == "WS-C6509-E")  ||         //  Abfrage der Chassis-Typen Cisss
    		(p.str2 == "WS-C4506")    ||
    		(p.str2 == "WS-C4506-E")  ||
    		(p.str2 == "WS-C4510R-E") ||
    		(p.str2 == "ASA5540"))
    
    	{
    		 p.str_OBJ_KONST  = "C__OBJTYPE__SWITCH";
    		 p.str_Hersteller = "CISSS";
    	}
    	else 
    	{
    		 p.str_OBJ_KONST  = "";
    		 p.str_Hersteller = "";
    	}
    
    	return true;
    }
    
    
    
    void schreibe_aus(ostream& out, const DatenCSV& p)
    {
    	out << p.str_OBJ_KONST << ';';
    	out << p.str4 << ';';
    	out << p.str_Hersteller << ';';
    	out << p.str4 << ';';
    //	out << p.str5 << ';';
    //	out << p.str5 << ';';
    //	out << p.str6 << ';';
    	out << p.str5 << '\n';
    } 
    
    
    
    
    int main()
    {
    	ifstream csvread_l("cisss-serial-1.csv");
    //	ifstream csvread_l("Test1.csv");
    	ofstream cswrite("Ausgabe_Cisss.csv");
    	if (!csvread_l.is_open())
    	{
    		cerr << "Fehler beim Oeffnen der Datei!" << endl;
    		return 1;
    	}
    
    	if (!cswrite.is_open())
    	{
    		cerr << "Fehler beim Oeffnen der Ausgabe-Datei!" << endl;
    		return 2;
    	}
    
    
    
    // Daten einlesen, auf cout ausgeben und in Datei speichern
    
    	DatenCSV daten;
    	while (lese_ein(csvread_l, daten))
    	{
    // in Standard-Ausgabe anzeigen (nur auf dem Bildschirm)
    		cout << daten.str_OBJ_KONST << endl;
    		cout << daten.str1 << endl;
    		cout << daten.str2 << endl;
    		cout << daten.str3 << endl;
    		cout << daten.str4 << endl;
    		cout << daten.str5 << endl;
    		cout << daten.str6 << endl;
    		cout << daten.str7 << endl;
    
    // in die Datei speichern
    		schreibe_aus(cswrite, daten);
    	}    
    
    
    
    	cswrite.close();
    	csvread_l.close();
    
    	return 0;
    }
    

    Gruß

    Berni

    Freitag, 12. Mai 2017 08:21
  • Hallo,

    du könntest einen Zeilenzähler in deine Einleseroutine hinzufügen, dann auf erste Zeile abfragen.

    	int iZeile = 0;
    	while (lese_ein(csvread_l, daten))
    	{
    		iZeile++;
    		if (iZeile == 1)
    		{
    			// erste Zeile ist Ueberschrift, wird nicht angezeigt
    		}
    		else
    		{
    // in Standard-Ausgabe anzeigen (nur auf dem Bildschirm)
    			cout << daten.str_OBJ_KONST << endl;
    			cout << daten.str1 << endl;
    			cout << daten.str2 << endl;
    			cout << daten.str3 << endl;
    			cout << daten.str4 << endl;
    			cout << daten.str5 << endl;
    			cout << daten.str6 << endl;
    			cout << daten.str7 << endl;
    		}
    
    // in die Datei speichern
    		if (iZeile == 1)
    		{
    	   		schreibe_ueberschrift(cswrite);
    		}
    		else
    		{
    	   		schreibe_aus(cswrite, daten);
    		}
    	}    

    Und die Funktion schreibe_ueberschrfit:

    void schreibe_ueberschrift(ostream& out)
    {
    	out << "Überschrift OBJ_KONST" << ';';
    	out << "Überschrift str4" << ';';
    	out << "Überschrift Hersteller" << ';';
    	out << "Überschrift str4" << ';';
    	out << "Überschrift str5" << '\n';
    } 
    
    
    Gruß Guido


    Freitag, 12. Mai 2017 09:04
  • ....die Idee ist zwar gut aber er verschluckt hier die erste Zeile von den Daten, weil er in die erste Zeile die Überschrift schreibt. Man müsste also die Daten um eine Zeile nach hinten (unten) sortieren. Bloß wie? Es gibt hier wenige Schleifenzähler.....?

    ...nu' wird's richtig schwierig...

    Gruß

    Berni

    Freitag, 12. Mai 2017 12:28
  • Wenn ich das richtig verstehe, sind in der Einlese-Datei nur Daten, keine Überschrift? Dann muss die erste Zeile in der Einlesedatei mit gespeichert werden.

    Um die Überschrift in die Ausgabedatei dann zu machen, kann man auch das alte nehmen und die Überschrift vor der Schleife speichern.

    	schreibe_ueberschrift(cswrite);
    	while (lese_ein(csvread_l, daten))
    	{
    // in Standard-Ausgabe anzeigen (nur auf dem Bildschirm)
    		cout << daten.str_OBJ_KONST << endl;
    		cout << daten.str1 << endl;
    		cout << daten.str2 << endl;
    		cout << daten.str3 << endl;
    		cout << daten.str4 << endl;
    		cout << daten.str5 << endl;
    		cout << daten.str6 << endl;
    		cout << daten.str7 << endl;
    
    // in die Datei speichern
       		schreibe_aus(cswrite, daten);
    	}    

    Freitag, 12. Mai 2017 12:44
  • ....ja, stimmt mal wieder - geht auch ohne Schleifenzähler!

    Besten Dank und schönes Wochenende,

    Berni

    Freitag, 12. Mai 2017 13:46
  • Hallo Guido,

    ich bin mit dem Programm schon gut vorwärts gekommen.

    Doch jetzt habe ich ein neues Problem:

    In diesem Programm sind die Einlese-Anweisung und die Ausgabe-Anweisung in einer Schleife. Es wird das CSV-File zeilenweise eingelesen, man kann die Spalten und die Werte verändern und es wird dann i. d. gleichen Schleife zeilenweise in das neue File gespeichert.

    Jetzt sollen alle Strings von einer Spalte (alle Durchläufe i. d.  Schleife) aneinandergehängt werden (mit “append“) und dann als neue String-Variable in eine Zelle im neuen File gespeichert werden.

    Als alter C/Fortran – Programmierer würde ich einfach eine neue Schleife davorsetzen und mir den neuen String mit “append“ erzeugen und dann in der zweiten Schleife an der richtigen Stelle herausschreiben.

    Bloß wie soll das hier gehen? Den String könnte ich mir schon erzeugen, doch wie bekomme ich dann die neue Variable auf das neue File geschrieben? 

    Wahrscheinlich muss man Einlese-Anweisung und Ausgabe-Anweisung in zwei Schleifen setzen, alle String-Variablen als Array speichern und dann wieder herausschreiben.

    Das ist aber viel Aufwand, vielleicht hast Du eine bessere Idee?

     

    Gruß,

     

    Berni

    Sonntag, 18. Juni 2017 18:53
  • Jetzt sollen alle Strings von einer Spalte (alle Durchläufe i. d.  Schleife) aneinandergehängt werden (mit “append“) und dann als neue String-Variable in eine Zelle im neuen File gespeichert werden.

    Hallo,

    ich verstehe zwar nicht ganz, warum man alle Strings in einer Spalte aneinanderhängen will, aber gehen würde es zum Beispiel wie folgt:

    // noch eine Datei öffnen ofstream cswrite_spalten("spalten.txt"); if (!cswrite_spalten.is_open()) { cerr << "Fehler beim Oeffnen der Ausgabe-Datei!" << endl;
    return 3;
    } // ... Schleife ergänzen DatenCSV spalten;
    spalten.str1 = ""; spalten.str2 = "";
    spalten.str3 = "";
    spalten.str4 = "";
    spalten.str5 = "";
    spalten.str6 = "";
    spalten.str7 = "";
    while (lese_ein(csvread_l, daten)) { // in Standard-Ausgabe anzeigen (nur auf dem Bildschirm) cout << daten.str_OBJ_KONST << endl; cout << daten.str1 << endl; cout << daten.str2 << endl; cout << daten.str3 << endl; cout << daten.str4 << endl; cout << daten.str5 << endl; cout << daten.str6 << endl; cout << daten.str7 << endl; // in die Datei speichern schreibe_aus(cswrite, daten); // daten in spalten anhängen spalten.str1 += daten.str1; spalten.str2 += daten.str2; spalten.str3 += daten.str3; spalten.str4 += daten.str4; spalten.str5 += daten.str5; spalten.str6 += daten.str6; spalten.str7 += daten.str7; } // spalten speichern cswrite_spalten << spalten.str1 << '\n'; cswrite_spalten << spalten.str2 << '\n'; cswrite_spalten << spalten.str3 << '\n'; cswrite_spalten << spalten.str4 << '\n'; cswrite_spalten << spalten.str5 << '\n'; cswrite_spalten << spalten.str6 << '\n'; cswrite_spalten << spalten.str7 << '\n'; cswrite_spalten.close();


    1. Du öffnest eine neue Ausgabedatei cswrite_spalten.

    2. Du definierst eine neue Variable spalten.

    3. In der Schleife hängst du den daten-String an die jeweiligen Strings in der Variable spalten ("append" wäre also += für string).

    4. Nach der Schleife speicherst du die Strings und schließt die Datei. Du hast nicht geschrieben, wie die Spalten gespeichert werden sollen, daher hab ich jetzt mal eine Datei genommen, wo die Spalten jeweils in einer Zeile geschrieben werden.

    Beachte, dass string auf size_t Länge begrenzt ist. Mehr als 2³²-1 oder 4294967295 Zeichen gehen nicht.

    Gruß
    Guido

    Montag, 19. Juni 2017 06:15
  • Hallo Guido,

    ich soll Daten von Online-Componenten in eine Datenbank hochschaufeln. Die Datenbank gibt dafür ein festes Format vor.

    Bis zur Spalte "Gerätezuweisung" habe ich es schon mit dem Programm geschafft. In der Spalte "Gerätezuweisung" (die Spalte ist hier per Hand eingetragen) soll nun in der Zeile des Chassis (C_OBJTYPE_SWITCH_CHASSIS) die Modell-Bez. vom Chassis stehen und in dem Feld darunter die Modell-Bezeichnungen der Switche (Einschübe), die in das Chassis hereinkommen (das sind die C__OBJTYPE__SWITCH (Modell) bis zum nächsten Chassis, 2x4, 1x5).

    Die Daten werden von einem anderen File eingelesen.

    Ich versuche gerade mal Deine neuen Ideen irgendwie einzubauen.

    Besten Dank,  Berni

    Objekttyp-Konstante Titel Hersteller Modell Seriennr. Gerätezuweisung
    C_OBJTYPE_SWITCH_CHASSIS sw4006-bib11-1 CICSI WS-C4506 FOX084606DB WS-C4506
    C__OBJTYPE__SWITCH WS-X4013+ CICSI WS-X4013+ JAE08491H82 WS-X4013+,WS-X4148-FX-MT1,WS-X4148-FX-MT2,WS-X4148-FX-MT3
    C__OBJTYPE__SWITCH WS-X4148-FX-MT CICSI WS-X4148-FX-MT1 JAB0817078Z
    C__OBJTYPE__SWITCH WS-X4148-FX-MT CICSI WS-X4148-FX-MT2 JAB0848092N
    C__OBJTYPE__SWITCH WS-X4148-FX-MT CICSI WS-X4148-FX-MT3 JAB09420482
    C_OBJTYPE_SWITCH_CHASSIS sw4006-bib13-1 CICSI WS-C4506-E FOX1344G22Q WS-C4506-E
    C__OBJTYPE__SWITCH WS-X4148-FX-MT CICSI WS-X4148-FX-MT1 JAB064804MS WS-X4148-FX-MT1,WS-X4148-FX-MT2,WS-X4448-GB-SFP,WS-X45-SUP6L-E
    C__OBJTYPE__SWITCH WS-X4148-FX-MT CICSI WS-X4148-FX-MT2 JAB072505RK
    C__OBJTYPE__SWITCH WS-X4448-GB-SFP CICSI WS-X4448-GB-SFP JAE1221IXG3
    C__OBJTYPE__SWITCH WS-X45-SUP6L-E CICSI WS-X45-SUP6L-E JAE14480PMV
    C_OBJTYPE_SWITCH_CHASSIS sw4006-bib15-1 CICSI WS-C4506-E FOX1241GFMK WS-C4506-E
    C__OBJTYPE__SWITCH WS-X4148-FX-MT CICSI WS-X4148-FX-MT1 JAB064804MH WS-X4148-FX-MT1,WS-X4148-FX-MT2,WS-X4148-FX-MT3,WS-X4448-GB-SFP,WX45-SUP6L-E
    C__OBJTYPE__SWITCH WS-X4148-FX-MT CICSI WS-X4148-FX-MT2 JAB072505RV
    C__OBJTYPE__SWITCH WS-X4148-FX-MT CICSI WS-X4148-FX-MT3 JAB081804EP
    C__OBJTYPE__SWITCH WS-X4448-GB-SFP CICSI WS-X4448-GB-SFP JAE1221J06T
    C__OBJTYPE__SWITCH WS-X45-SUP6L-E CICSI WS-X45-SUP6L-E JAE14480E1O

    Montag, 19. Juni 2017 12:49