Mehrdimensionales Array Zeilenweise in Datei schreiben



  • Hallo!

    Ich will ein mehrdimensionles Array (int array[n][m]) mit n Zeilen und m Spalten in eine Datei schreiben. Aber nicht Zelle für Zelle sondern Zeile für Zeile.

    Meine Lösung hier schreibt anscheinend immer nur den Wert der iten Zeile und 1. Spalte in die Datei:

    fstream out;
    out.open("C:\test.txt", ios::out);
    for(int i=0; i < zeilenAnzahl; i++)
    {			
    	out.write((char *)&array[i] ,sizeof(array[i]);
    
    	/* prüfen, ob Schreiben erfolgreich */
    	if(out.bad() || out.fail())
    	{
    		out.close();
    		return -1;
    	}
    }
    out.close();
    

    Wie bekomme ich also den Inhalt aller m Spalten der iten Zeile auf einmal in die Datei?



  • Wie meinst du das mit "Zeile pro Zeile"? - Das ist schlussendlich ja auch wieder alles.

    Im übrigen schreib doch einfach mittels operator << in die Datei. Das ist viel angenehmer, wenn es sich um Textdateien handelt. 😉



  • Mit "Zeile für Zeile" meine ich, dass Alles was in der aktuellen Zeile steht auf einmal rausgeschrieben werden soll.

    "Normalerweise" müsste man jede Spalte der jeweiligen Zeile einzeln rausschreiben - also in etwa so:

    for(int i=0; i < zeilenAnzahl; i++)
    {            
        for(int j=0; i < spaltenAnzahl; j++)
        {
            out << "Zeile: " << i << " Spalte: " << j << " Wert: " << array[i][j] << endl;
    
            /* prüfen, ob Schreiben erfolgreich */
            if(out.bad() || out.fail())
            {
              out.close();
              return -1;
            }
        }
    }
    

    Dann muss man aber auch für jeden Wert prüfen ob das Schreiben erfolgreich war...


  • Administrator

    Nimm das std::endl in die äussere Schleife, und dann hast du, was du brauchst. Zudem noch Exceptions rein, damit du nicht immer überprüfen musst, sondern der Stream dies für dich erledigt.

    out.exceptions(std::ios::badbit | std::ios::failbit);
    
    try
    {
        for(int i=0; i < zeilenAnzahl; i++)
        {            
            for(int j=0; i < spaltenAnzahl; j++)
            { out << array[i][j] << ' '; } // Leerschlag als Trennung
    
            out << std::endl; // Neue Zeile am Ende jeder Arrayzeile.
        }
    }
    catch(std::ios::failure& error)
    {
       // Error in stream!
       out.close(); // Wobei nicht unbedingt nötig, da close bei der Destruktion sowieso aufgerufen wird.
    }
    

    Grüssli


Anmelden zum Antworten