Merge zweier Datein (lesen in geschachtelter Schleife)
-
Hallo,
nachdem ich jetzt Stunden mit Doku lesen, Probieren und Suchen verbracht habe, fällt mir nichts mehr ein und ich brauche Hilfe. Das ist sicher eine Anfängerfrage, aber ich habe keine Idee, wie ich weiterkomme.
Ich habe mein Problem mit einem kleinen Programm rekonstruiert. Aus zwei Dateien soll eine neue entstehen. Jede Zeile der ersten Datei soll mit jeder Zeile der zweiten Datei gemergt werden.
Es scheint so, dass die innere Schleife korrekt läuft, aber sobald sie ein eof bekommt, endet auch die äußere Schleife.(?)
Was mir auch nicht gefällt (ist aber nicht schlimm): die neue Datei wird in einer Mini-Schrift geschrieben.mein Programm:
// test.cpp: Hauptprojektdatei.#include "stdafx.h"
#include <string>
#include <iostream>
#include <fstream>using namespace std;
using namespace System;int main(array<System::String ^> ^args)
{
string farbe;
string kleidung;
string neuDateiname;
string neuZeile;int anzahl = 1;
ifstream farbenDatei (".\\farben.txt");
ifstream kleidungDatei (".\\kleidung.txt");
neuDateiname = (".\\neu.txt");
ofstream neuDatei (neuDateiname, ofstream::app);
while ((!farbenDatei.eof()) && (anzahl <=8))
{
getline (farbenDatei, farbe);
while ((!kleidungDatei.eof()) && (anzahl <=8))
{
getline (kleidungDatei, kleidung);
neuZeile = kleidung + " in " + farbe + "\n";
neuDatei << neuZeile;
anzahl++;
}
}
farbenDatei.close();
kleidungDatei.close();
neuDatei.close();
return 0;
}Datei farben.txt:
rot
grün
blauDatei kleidung.txt:
Hose
Shirt
Pullover
Rockneue Datei:
Hose in rot
Shirt in rot
Pullover in rot
Rock in rotWie funktioniert das richtig?

Vielen Dank!
-
Die Warterei war nichts für mich, und so habe ich mir jede Variable in jedem Schritt ausgeben lassen und gesehen, dass er die äußere Schleife doch weiter durchläuft aber die innere nicht mehr. Also war ich auf der falschen Fährte.
Habe dann kapiert, dass er den Dateizeiger der zweiten Datei nicht zurück auf den Anfang setzt. Also nach der inneren Schleife noch Zeiger zurükgesetzt, wenn er am Dateiende angekommen ist (seekg).Bis auf die Minischrift bin ich jetzt zufrieden. Bleibt also die eigentlich nicht mehr so wichtige Frage: wie gebe ich meine Strings in "Normalschrift" aus?
-
Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++/CLI mit .NET verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ (auch C++0x und C++11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
CandaceLike schrieb:
Bleibt also die eigentlich nicht mehr so wichtige Frage: wie gebe ich meine Strings in "Normalschrift" aus?
Wie kommst du auf die Idee, die Schrift würde in der Datei stehen?
-
Das gibt's doch garantiert als fertiges Kommandozeilentool.
Aber wenn's unbedingt als C++ sein soll (ich entferne mal deinen C++-C++/CLI-Mischmasch. C++ und C++/CLI sind unterschiedliche Sprachen!), könnte man das so machen:
#include <iostream> #include <sstream> #include <string> #include <vector> using namespace std; int main() { vector<string> clothes, colors; { stringstream color_file("rot\ngrün\nblau\n"); stringstream clothes_file("Hose\nShirt\nPullover\nRock\n"); for(string color; getline(color_file, color); colors.push_back(color)); for(string cloth; getline(clothes_file, cloth); clothes.push_back(cloth)); } for (string const& cloth: clothes) for (string const& color: colors) { cout << cloth << " in " << color << '\n'; } }Ich nehme hier mal stillschweigend an, dass beide Dateien locker in den Arbeitsspeicher passen. Man könnte es natürlich auch so schreiben, dass man die Werte nicht zwischenspeichert, aber das wäre ein bisschen umständlicher.
-
for(string color; getline(color_file, color); colors.push_back(color));Komisch. Gerade weil Farben keine Leerzeichen innehaben (Hellblau, usw.) würde ich zu
vector<string> colors( istream_iterator<string>(color_file), istream_iterator<string() );tendieren.
Oder ist das irgendwie festgelegt?
-
Es ist hier ganz eindeutig ein Format, das durch Zeilenumbrüche zwischen den Begriffen trennt. Deine Festlegung, dass Farben keine Leerzeichen enthielten, ist kurzsichtig, willkürlich und sicherlich auch falsch. Man hat keinerlei Vorteil, dafür jede Menge Nachteile.