Arbeiten mit Feldern, "umdrehen einer Eingabe"

Roncalli

Grünschnabel
Ich habe folgende Aufgabenstellung zu lösen, nur langsam aber sicher verzweifel ich daran:
In einer Datei steht folgendes:

1.6.2000, Donnerstag
3.7.2001, Dienstag

Sinn des Programms soll werden, dass die Ausgabe mal so aussieht:

Donnerstag, den 1.6.2000
Dienstag, den 3.7.2001

Das Programm hier soll inetwa die Lösung dafür sein (ist von einem Kumpel), aber es funktioniert nicht.
Ich erreiche nur eine Ausgabe Donnerstag, den danach folgen Leerzeichen und wirre Zeichen. Ich habe auch schon mit dem Debugmodus gearbeitet, aber ich werde aus ihm nicht schlau.

Code:
#include <stdio.h>
#include <fstream>
#include <iostream>

using namespace std;

int main()
{
	ifstream ein;
	ein.open("c:\\temp\\Datum.txt");
	if (!ein.good()) return 0;
	char* feld= new char[100];
	char ch;
	int i=0,e=0,w=0;

	while (ein.get(ch))
	{  
		feld[i]=ch;
		i++;
		cout << ch;
	}
	cout << "\n\n";   //bis hier her funktioniert alles
	
	feld[i-1]='\0';   //versteh ich nich, ist das die abschließende 0 der Datei?
	for(int w=0;w<i;w++)
	{
		if (feld[w]==',')  //gehe die Schleife solange durch bis ein , kommt und gebe die nachfolgenden Zeichen aus (+2 damit das komma und das leerzeichen nicht mitgeschrieben werden
		{
			for(int r=w+2;feld[r]!='\n';r++&&e++) //wozu e++
			{
				cout<<feld[r];
			}
			cout<<", den ";
			e--;   
			for(int z=w-e-1;feld[z]!=',';z++&&e--) //was soll das?
			cout<<endl;
		}
	}
	delete feld;
	system("pause");
	return 0;


Wie komme ich an die Zeichen ran, die vor dem Komma stehn? Gibt es eine elegantere Möglichkeit, die Aufgabenstellung zu lösen? z.B. das nur kleine Änderungen nötig werden wenn man eine Datei einließt die z.b. so aussieht:
1100 bananen
1200 birnen
und wo das erreicht werden soll:
bananen 1100
birnen 1200

Prinzipiell geht es einfach nur darum an bestimmten Stellen Eingaben zu drehen.
Ich sitze hier nun schon seit Stunden und bekomme es einfach nicht hin.


Falls sich jmd damit sehr gut auskennt , TS² kennt und lust hat mir das mal in Worten zu erklären, der kann mir gerne ne PN schreiben.vlt kann mir auch jmd per icq(131472160) helfen.
Aber mit einer Antwort hier im Forum bin ich natürlich auch erstmal zu frieden.

Vielen Dank!
 
Hi.
Code:
#include <stdio.h>
In C++ werden Header der Standard-C-Bibliothek ohne Endung, mit dem Präfix "c" eingebunden:
C++:
#include <cstdio>
Code:
	feld[i-1]='\0';   //versteh ich nich, ist das die abschließende 0 der Datei?
Nein. Das hat mit der Datei nichts zu tun. Aber C-Strings haben keine Länge, sondern starten an einer bestimmten Stelle und sind erst zu Ende wenn ein \0 Zeichen kommt. Das \0 ist also ein Marker für das Ende des Strings:
C++:
char str[] = "Das ist ein String."; // wird automatisch terminiert
str[5] = '\0'; // String nach 5 Zeichen terminieren

cout << str; // gibt "Das i" aus
Wenn ein String nicht terminiert wird dann kann das zum Programmabsturz führen, oder es werden nur komische Zeichen ausgegeben.
Code:
	for(int w=0;w<i;w++)
	{
		if (feld[w]==',')  //gehe die Schleife solange durch bis ein , kommt und gebe die nachfolgenden Zeichen aus (+2 damit das komma und das leerzeichen nicht mitgeschrieben werden
		{
			for(int r=w+2;feld[r]!='\n';r++&&e++) //wozu e++
Hier wird's dann so langsam unübersichtlich und ist zumindest auch noch unvollständig.

Habt ihr denn schon Funktionen behandelt? Dann solltet ihr auch Funktionen schreiben. Andererseits gibt es schon Funktionen zum suchen in einem String, z.B. die strchr Funktion.
Code:
	delete feld;
Da das Feld mit dem new[] Operator angelegt wurde, muss hier entsprechend mit dem detete[] Operator freigegeben werden:
C++:
delete[] feld;
Wie komme ich an die Zeichen ran, die vor dem Komma stehn? Gibt es eine elegantere Möglichkeit, die Aufgabenstellung zu lösen?
Ja. Man könnte die getline Methode verwenden:
C++:
char tag[100];
char datum[100];

while (ein.getline(datum, 100, ',') && ein.getline(tag, 100)) {
  cout << tag << ", den " << datum << endl;
}
Je nachdem was der Sinn der Aufgabe ist (was soll denn geübt werden?) ist das aber mehr oder weniger nützlich.

Gruß
 
Der Sinn der Aufgabe ist einfach nur der Umgang mit stream-klassen.
Wie ich es löse, ist mir völlig frei überlassen. Diese Art von Aufgabe ist jedoch sehr beliebt in Klausuren und bringt nen Haufen Punkte.Daher scheint der getline Ansatz besser.Wenn er mir das schön auftrennt nach Datum und Tag sollte es mit anderen Sachverhalten z.b. Anzahl und Obst genauso gut gehn!

als i-tüpfelchen:
Der Name der Datei soll in der Kommandozeile übergeben
werden.


ich glaub, das hat man als argument von main gemacht oder?
sowas in der form

Code:
int main( int argc, char *argv[])


ich versuche mal mit deinen tipps weiter zu programmieren.falls sich ein neues problem ergibt melde ich mich wieder :)


P.S.

danke, funktioniert jetzt wunderbar!!
 
Zuletzt bearbeitet:
Zurück