Dateizugriffe (Lesen von einer Datei)

Wie kann ich eine Datei auslesen z.B. die artikel.con oder daten.con und jeweils die Teile die Durch Leerzeichen getrennt wurden (bsp.
Code:
 AMD 123456789 2 50
in eine der in der Struktur festgelegten, variablen speichern. Die Struktur ist zudem ein Array und wird halt in einer for(i=0,i<n;i++) ausgelesen
Code:
struct artikel
{
	int menge;
	string name;
	string nummer;
	float preis;
};



MfG
Abstauber
 
Hallo,
die Sprache zu wissen wäre schön.
Sonst einfach Datei auslesen, und in vielen Sprachen gibst dann eine Funktion 'Split()' oder 'explode()' etc., womit man einen String anhand eines Trennzeichen teilen kann
 
Hallo,
einfach mal bei Google: 'C++ Split' eingeben, da findest du genug Funktionen um einen String anhand eines Trennzeichens zu trennen.

Und eine Datei einzulesen und in einem String abzuspeichern, sollte nicht so das Prob. darstellen.

Wenn du die Datei dann im String drinne hast, schaust du welches Trennzeichen zu verwenden möchtest, hier z.B. das Leerzeichen.
Dann die einzelne Elemente deines zurückgegebenen Arrays in der Struktur abspeichern
 
Ich finde das gut dass du mir helfen wolltest jedoch ich habe gegoogelt und hier die suche benutzt dennoch finde ich nix, was für mich verwertbar wäre, kann mir das vllt jemand erklären wie das geht?

mFg
Abstauber
 
Code:
#include <iostream>
#include <fstream>

using namespace std;

struct artikel
{
        int menge;
        string name;
        string nummer;
        float preis;
};

int main()
{
	ifstream in("artikel.con");
	artikel dat;

	if(!in.is_open()) {
		cerr << "Fehler beim Öffnen der Datei!" << endl;
		return(1);
	}

	for(int i=1 ; ; i++) {
		in >> dat.menge >> dat.name >> dat.nummer >> dat.preis;
		if(in.eof())
			break;
		cout << i << "." << endl;
		cout << " Menge:  " << dat.menge << endl;
		cout << " Name:   " << dat.name << endl;
		cout << " Nummer: " << dat.nummer << endl;
		cout << " Preis:  " << dat.preis << endl;
		cout << endl;
	}
	return(0);
}
 
also ich habe es jetzt so ausprobiert:

Code:
case '2':	cout<<"\n\t <2> Artikel Ansehen";
						dat=new artikel[n];
						for(i=0;i<n;i++)
						{
							inadata >> dat[i].menge >> dat[i].name >> dat[i].nummer >> dat[i].preis;
							if(inadata.eof())
							break;
							cout << i << "." << endl;
							cout << " Menge:  " << dat[i].menge << endl;
							cout << " Name:   " << dat[i].name << endl;
							cout << " Nummer: " << dat[i].nummer << endl;
							cout << " Preis:  " << dat[i].preis << endl;
							cout << endl;
						}
						inadata.close();							
						cout<<adata;
						cout<<"\n\tDr\x81 cken Sie <Enter> um fortzufahren"<<endl;
						cin.get();
						break;

die Variable dat habe ich als Dynamischenspeicher angelegt mittels *dat und nacher dat=new artikel[n]. Er führt das Programm auch aus doch wenn ich die 2 drücke kommt ne Messagebox die mir sagt von einem Debugfehler und i-was mit allocated memory of size: bla bla blubb.

Wie kann ich den fehler beheben?
 
Anscheinend hast du ja grundlegende Schwierigkeiten... dafür, dass du einen "Programmierlehrer" hast X(

Aus dem Fehler kann man nicht viel schließen, da der Rest des Programms fehlt.
Außerdem solltest du mal schauen, was passiert, wenn man zweimal "2 drückt" und wann dat freigegeben wird...
Prüfen, ob überhaupt Speicher angefordert werden konnte...
...
...
und statt einem "dynamischen" array kann man besser die C++ template-Liste verwenden. Da muss die Anzahl der Elemente nicht vorher feststehen, sondern wird dynamisch beim Einlesen der Datei vergrößert.
 
hier ist der gesamte QC:

Code:
// Rechnungserstellungsprogramm
// 1-8-2006 (c) by Marco Matthias Franke

#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <string>
#include <fstream>

using namespace std;

struct artikel
{
	int menge;
	string name;
	string nummer;
	float preis;
};

struct rechnung
{
	string mitarbeiter;
	string versandart;
	string bezug;
	string lieferbedingungen;
	string empfaenger;
	string estrasse;
	string epostleitzahl;
	int rechnungsnummer;
	int kundennummer;
};

void main()
{
	char auswahl=' '; 
	int x=1,i,n;	
	float endpreis=0;
	string kdata,adata;
	artikel *daten, *dat;
	rechnung *rdaten;

	system("mkdir Daten\\save");
	system("cls");

	// In Datei schreiben
	ofstream outadata("Daten\\save\\artikel.con", ios::out | ios::app);
	ofstream outrdata("Daten\\save\\daten.con", ios::out | ios::app);
	ofstream outr("Daten\\Rechnung.html", ios::out);

	// Aus Datei lesen
	ifstream inadata("Daten\\save\\artikel.con", ios::in);
	ifstream inrdata("Daten\\save\\daten.con", ios::in);

	SYSTEMTIME tm;
	GetLocalTime(&tm);

	do
	{
		cout<<"\n\t\t\xC9\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBB";
		cout<<"\n\t\t\xBA "<<tm.wHour<<":"<<tm.wMinute<<" Uhr \t\t\t  "<<tm.wDay<<"."<<tm.wMonth<<"."<<tm.wYear<<" \xBA";
		cout<<"\n\t\t\xC8\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBC"<<endl;
		
		// Menü
		cout<<"\n\t <1>  Artikel hinzuf\x81gen/\x84ndern";
		cout<<"\n\t <2>  Artikel ansehen";
		cout<<"\n\t <3>  Kundendaten eingeben";
		cout<<"\n\t <4>  Einkauf laut Liste";
		cout<<"\n\t <5>  Rechnung in Datei ausgeben (Rechnung.html)";
		cout<<"\n\t<ESC> Programm beenden";
		//Menü

		cout<<"\n\n\tWas moechten Sie tun? \n\t\xAF "<<flush;
		auswahl=getche();
		auswahl=auswahl+'\0';
		
		switch(auswahl)
		{
			case '1':	system("cls");
						cout<<"\n\t <1>  Artikel hinzuf\x81gen/\x84ndern"<<endl;
						cout<<"\n\n\tWieviele Artikel wollen Sie einlesen ? \n\t\xAF ";
						cin>>n;

						daten=new artikel[n];
						for(i=0;i<n;i++)
						{
							cout<<"\n\tWelchen Artikel wollen Sie eingeben? \n\t\xAF ";
							cin>>daten[i].name;
							cout<<"\n\tWelche Nummer hat der Artikel \""<<daten[i].name<<"\"? \n\t\xAF ";
							cin>>daten[i].nummer;
							cout<<"\n\tWie viel kostet der Artikel \""<<daten[i].name<<"\" (in Euro)? \n\t\xAF ";
							cin>>daten[i].preis;
							cout<<"\n\tWie viel wollen Sie von dem Artikel \""<<daten[i].name<<"\" einkaufen? \n\t\xAF ";
							cin>>daten[i].menge;
						}
						for(i=0;i<n;i++)
						{
							outadata<<daten[i].name<<" "<<daten[i].nummer<<" "<<daten[i].menge<<" "<<daten[i].preis<<" \n";
						}
						outadata.close();
						break;

			case '2':	cout<<"\n\t <2> Artikel Ansehen";
						dat=new artikel[n];
						for(i=0;i<n;i++)
						{
							inadata >> dat[i].menge >> dat[i].name >> dat[i].nummer >> dat[i].preis;
							if(inadata.eof())
							break;
							cout << i << "." << endl;
							cout << " Menge:  " << dat[i].menge << endl;
							cout << " Name:   " << dat[i].name << endl;
							cout << " Nummer: " << dat[i].nummer << endl;
							cout << " Preis:  " << dat[i].preis << endl;
							cout << endl;
						}
						inadata.close();							
						cout<<adata;
						cout<<"\n\tDr\x81 cken Sie <Enter> um fortzufahren"<<endl;
						cin.get();
						break;

			case '3':	system("cls");
						cout<<"\n\t <3>  Kundendaten eingeben"<<endl<<endl;
						break;

			case '4':	system("cls");
						cout<<"\n\t <4>  Einkauf laut Liste"<<endl<<endl;
						break;

			case '5':	system("cls");
						cout<<"\n\t <5>  Rechnung drucken"<<endl<<endl;
						outr<<"\n<html>";
						outr<<"\n<head>";
						outr<<"\n<title>Rechnung</title>";
						outr<<"\n<style type=\"text/css\">";
						outr<<"\n<!--";
						outr<<"\nbody {font-family: Verdana;text-align: left;color: #000000;background: #FFFFFF;bold}";
						outr<<"\n-->";
						outr<<"\n</style><body><table width=\"100%\"><tr>";
						outr<<"\n <td width=\"75%\"  valign=\"middle\">";
						outr<<"\n <br><br><br><br>";
						outr<<"\n Franke, Heinz-Jürgen<br>";
						outr<<"\n PC Notdienst<br>";
						outr<<"\n Kopernikusweg 3<br><br>";
						outr<<"\n 41751 Viersen<br></td> <td width=\"25%\" align=\"right\">";
						outr<<"\n reaL-Insanity PC-Systeme GmbH<br>";
						outr<<"\n Kopernikusweg 3  41751 Viersen<br> ";
						outr<<"\n Telefon: 02153/1399610<br>";
						outr<<"\n E-Mai: info@real-insanity.de<br><br><br>";
						outr<<"\n<u> Bankverbindung:</u><br>";
						outr<<"\n Sparkasse Krefeld<br>";
						outr<<"\n Kto: 1344167  Blz: 320 500 00";
						outr<<"\n </td></tr></table>";
						outr<<"\n<br><br><hr><b><font size=\"+1\">Rechnungsnummer:</font></b><br><hr>";
						outr<<"\n<table width=\"100%\">";
						outr<<"\n<tr>";
						outr<<"\n <td width=\"33%\">Kundennummer:</td>";
						outr<<"\n <td width=\"33%\">Ihr Zeichen:</td>";
						outr<<"\n <td width=\"33%\">Bearbeiter </td>";
						outr<<"\n</tr>";
						outr<<"\n<tr>";
						outr<<"\n <td width=\"33%\">Belegnummer:</td>";
						outr<<"\n <td width=\"33%\">Ihr Beleg:</td>";
						outr<<"\n <td width=\"33%\">Ihre UStIDNr: </td>";
						outr<<"\n</tr>";
						outr<<"\n<tr>";
						outr<<"\n <td width=\"33%\">Datum: "<<tm.wDay<<"."<<tm.wMonth<<"."<<tm.wYear<<"</td>";
						outr<<"\n <td width=\"33%\">Bezug: </td>";
						outr<<"\n <td width=\"33%\">Unsere UStIDNr: </td>";
						outr<<"\n</tr>";
						outr<<"\n<tr>";
						outr<<"\n <td width=\"33%\">Versandart:</td>";
						outr<<"\n <td width=\"33%\">Lieferbedingungen: </td>";
						outr<<"\n <td width=\"33%\">Steuer-Nr: 102/5011/0504 </td>";
						outr<<"\n</tr>";
						outr<<"\n</table>";
						outr<<"\n<br><br>Aufgrund unserergeleisteten Lieferung berechnen wir Ihnen zu unseren Allgemeinen Geschäftsbedingungen wie folgt:";
						outr<<"\n<br><br><br><table width=\"100%\" border=\"0\">";
						outr<<"\n<tr bgcolor=\"#C0C0C0\">";
						outr<<"\n <td width=\"5%\"> Position:</td>";
						outr<<"\n <td width=\"16%\"> Artikelnummer:</td>";
						outr<<"\n <td width=\"25%\"> Bezeichnung:</td>";
						outr<<"\n <td width=\"*%\"> Menge:</td>";
						outr<<"\n <td width=\"16%\"> Einzelpreis:</td>";
						outr<<"\n <td width=\"16%\"> Gesamtpreis:</td>";
						outr<<"\n</tr>";
						for(i=0;i<n;i++)
						{
							outr<<"\n<tr>";
							outr<<"\n <td>"<<i+1<<"</td>";
							outr<<"\n <td>"<<daten[i].nummer<<"</td>";
							outr<<"\n <td>"<<daten[i].name<<"</td>";
							outr<<"\n <td>"<<daten[i].menge<<"</td>";
							outr<<"\n <td>"<<daten[i].preis<<"</td>";
							outr<<"\n <td>"<<daten[i].preis*daten[i].menge<<"</td>";
							outr<<"\n</tr>";
						}
						outr<<"\n<tr bgcolor=\"#C0C0C0\">";
						outr<<"\n <td> </td>";
						outr<<"\n <td> </td>";
						outr<<"\n <td> </td>";
						outr<<"\n <td> Zwischensumme in EUR</td>";
						outr<<"\n <td> </td>";
						for(i=0;i<n;i++)
						{
							endpreis=(daten[i].preis*daten[i].menge)+endpreis;
						}
						outr<<"\n <td>"<<endpreis<<"</td>";
						outr<<"\n</tr>";
						outr<<"\n<tr>";
						outr<<"\n <td> </td>";
						outr<<"\n <td> </td>";
						outr<<"\n <td> zzgl. MwSt. von</td>";
						outr<<"\n <td> 19,00 % </td>";
						outr<<"\n <td> </td>";
						outr<<"\n <td>"<<(endpreis/1.19)<<"</td>";
						outr<<"\n</tr>";
						outr<<"\n<tr bgcolor=\"#C0C0C0\">";
						outr<<"\n <td> </td>";
						outr<<"\n <td> </td>";
						outr<<"\n <td> </td>";
						outr<<"\n <td> Endsumme in EUR</td>";
						outr<<"\n <td> </td>";
						outr<<"\n <td>"<<endpreis*1.19<<"</td>";
						outr<<"\n</tr>";
						outr<<"\n</table>";
						outr<<"\n </font>";
						outr<<"\n</body>";
						outr<<"\n</html>";
						cout<<"\n\tDie Datei wurde in dem Order gespeicher´t!";
						outr.close();
						cout<<"\n\tDr\x81 cken Sie <Enter> um fortzufahren"<<endl;
						cin.get();
						break;

			case '\x1B':cout<<"\n\tDas Programm wird beendet..."<<endl<<endl;
						exit(0);
						break;

			default:	cout<<"\n\tEs wurde ene falsche Eingabe get\x84tigt!"<<endl<<endl;
						cout<<"\n\tDr\x81 cken Sie <Enter> um fortzufahren"<<endl;
						cin.get();
						break;

		}
		system("cls");

	}
	while(x!=0);		
};

wo liegt der fehler und wie muss ich das einlesen aus einer Dateigestallten?
 
1. Alles was mit new angefordert wurde, muss auch wieder mit delete freigegeben werden. Daher ist das Benutzen des list-templates vllt einfacher (siehe EDIT).
2. Bankdaten sollte man evtl zensieren....

EDIT:
Code:
#include <iostream>
#include <fstream>
#include <list>
#include <string>

using namespace std;

struct artikel
{
	int menge;
	string name;
	string nummer;
	float preis;
};

int main()
{
	artikel dat;
	list <artikel> lst;
	list <artikel> :: iterator iter;
	int i;

	cout << "Lade Daten..." << flush;

	ifstream in("artikel.con");
/* Inhalt von artikel.con:
12 Bla 9423765-HB 12.98
99 haa 76182364-XY 11.45
*/
	if(!in.is_open()) {
		cerr << "Fehler beim Öffnen der Datei!" << endl;
		return(1);
	}

	for(i = 1 ; ; ++i) {
		in >> dat.menge >> dat.name >> dat.nummer >> dat.preis;
		if(in.eof())
			break;
		lst.push_back(dat);
	}

	in.close();

	cout << "fertig!\n" << endl;

	cout << "Ausgabe der Daten:\n" << endl;

	i = 1;
	for(iter = lst.begin() ; iter != lst.end() ; ++iter, ++i) {
		cout << "Artikel Nr. " << i << endl;
		cout << "   Menge:  " << iter->menge << endl;
		cout << "   Name:   " << iter->name << endl;
		cout << "   Nummer: " << iter->nummer << endl;
		cout << "   Preis:  " << iter->preis << endl;
		cout << endl;
	}
	
	cout << "Ausgabe vollständig!\n" << endl;
	
	cout << "Speichere Daten..." << flush;

	ofstream out("artikel.con.sav");

	if(!out.is_open()) {
		cerr << "Fehler beim Öffnen der Datei!" << endl;
		return(1);
	}

	for(iter = lst.begin() ; iter != lst.end() ; ++iter) {
		out << iter->menge << " " << iter->name << " " << iter->nummer << " " << iter->preis << endl;
	}
	
	out.close();

	cout << "fertig!" << endl;

	return(0);
}
 
auch Probleme!

Hallo zusammen...

ich habe hier folgendes Problem! Sprache soll Ansi-C sein!

Und zwar habe ich eine Datei in der immer zwei Zahlen die zusammen gehören durch ein ; getrennt sind.

Bsp.: 00010108217;22175;00010108217;22575;00010108217;28179;

es geht dann immer weiter so...

meine Aufgabe ist es, dass ich die Zahl vor dem Semikolon und die danach in jeweils eine Variable speichere. Danach lese ich den im Prinzip dritten String ein und soll ihn mit dem ersten vergleichen. Wenn diese gleich sind soll der vierte an den 2.ten angehängt werden. Und so weiter und so weiter. Sind sie nicht gleich soll der erste mit dem zweiten zusammen in eine neue Datei geschrieben werden und dann beim dritten weitergemacht werden.

Aber da ich irgendwie nicht wirklich viel Ahnung von C habe brauche ich dringend Hilfe! Danke!

Code:
#include <stdio.h>
#include <string.h>
#define dateiname "C:/xxx/test.txt"

void main(void)
{
	int i;
	FILE *datei;
	char *buffer = NULL;
	char *zeiger = NULL;
	char kass1[15][15] = {""};
	char ret;

	printf("\nListe wird neu sortiert erstellt...");

	datei = fopen(dateiname,"r");

	if(!datei)
		printf("\nFehler beim oeffnen der Datei!");	
	
	for(;;)
	{
		ret = fscanf(datei,"%s",buffer);

		if(ret != EOF)
			printf("\n\n1. Ausgabe: %s",buffer);
		else break;
	}

	for(i=0;(zeiger = strchr(buffer, ';')) != NULL;i++)
	{
		*zeiger = '\0';
		sprintf(kass1[i], "%s", buffer);
		buffer = zeiger + 1;
	}

	printf("\n2. Ausgabe: %s",buffer);

	fclose(datei);
}

[EDIT] Keiner der mir helfen kann? ^^[/EDIT]
 
Zurück
Oben