Fehler bei Speicher/ Lesefunktion
-
ok,.man hätte es auch mit konstanten machen können,..
-
wie fies,.wenn du mir nicht helfen magst,.dann tue es nicht,.kann mein infor-lehrer auch fragten,.wollte es aber ohne hilfe eines diplomtypen,.xD aber dann bin ich hier wohl auch falsch ok,.thread beendet..
*cry*
-
Ich wollte nur damit ausdrücken, daß "zeigt einen Fehler" alles mögliche bedeuten kann und ich für eine korrekte Antwort Deine Debuggingarbeit übernehmen müsste. Fehler beim Programmieren sind normal und diese zu lösen stellt mehr zufrieden als der Ärger vorher. Das macht ja die Sache so spannend. "zeigt einen Fehler" läßt halt vermuten, daß da einer nur auf eine Antwort hofft, ohne das Problem genau analysiert zu haben. Nimm es als Ansporn, einem Anfänger hilft man meist aus Mitleid, wenn einer ein interessantes Problem hat, hilft man, weil es einen selber interessiert.
-
Also,.ich habe es mal getestet,..speichern tut er,..nur auslesen (lesefunktion),...funktioniert nicht,.könnte jemand sagen, wieso?
-
Ich habe es jetzt einmal mit stream geschrieben,..
void speichern() { ofstream dataus; dataus.open("Konfig",ios::out); dataus << feld; dataus.close(); } /////////////////////////////Lesen///////////////////////////////////////////////////// void lesen() { ifstream datin; datin.open("Konfig",ios::in); int z = 0; do { datin >> feld; } while(!datin.eof()) z++; datin.close(); }
mein Compiler meint
2 C:\Programme\Dev-Cpp\include\c++\3.4.2\backward\iostream.h:31, from main.cpp In file included from C:/Programme/Dev-Cpp/include/c++/3.4.2/backward/iostream.h:31, from main.cpp
32:2 C:\Programme\Dev-Cpp\include\c++\3.4.2\backward\backward_warning.h #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
C:\Dokumente und Einstellungen\USER\Desktop\Triathlon1.1\main.cpp In function `void lesen()':
188 C:\Dokumente und Einstellungen\USER\Desktop\Triathlon1.1\main.cpp no match for 'operator>>' in 'datin >> feld'
note C:\Programme\Dev-Cpp\include\c++\3.4.2\bits\istream.tcc:87 candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>&(*)(std::basic_istream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
und etc,..da ist bestimmt nur ein kleiner Fehler,..
Die schreibfunktion funktioniert soweit
-
Was ist 'feld'? Und hast du für dessen Typ einen operator>> definiert?
(die erste Warnung besagt ganz einfach, daß du anstelle von <iostream.h> besser <iostream> verwenden solltest (erstere ist veraltet und nicht 100% standardkompatibel))
-
#include <iostream> // ifstream/ ofstream etc.. using namespace std; struct Daten { string Name; int Staffelnummer; float Schwimmzeit; float Radzeit; float Laufzeit; int Geschlecht; float Ergebnisse; }; Daten feld[6]; void speichern() { ofstream dataus; dataus.open("Konfig",ios::out); dataus << feld; dataus.close(); } /////////////////////////////Lesen///////////////////////////////////////////////////// void lesen() { ifstream datin; datin.open("Konfig",ios::in); int z = 0; do { datin >> feld; } while(!datin.eof()) z++; datin.close(); }
hmz,..er führt immernoch nicht das Programm aus
-
Also du hast wohl immer noch nichts gelernt was? Gib doch die Fehler an die du hast. Ein "Geht nicht!" sagt doch garnichts aus.
Zuerst fehlen dir ein paar Header:
#include <iostream> #include <fstream> #include <string> #include <sstream>
Die sollten fürs erste reichen.
Und wie jemand schon sagte: Das
dataOut << feld;
speichert nur die Adresse nicht das Feld. Davon hast du nichts.
Du brauchst sowas:
for (unsigned int i = 0; i < 6; ++i) dataOut << feld[i];
Und selbst dann musst du noch einen eigenen <<-Operator definieren.
Ungefähr so:
ostream& operator <<(ostream& out, const Daten& daten) { out << daten.Name; out << daten.Staffelnummer; // und so weiter... }
Dasselbe gilt natürlich für den >>-Operator.
Gruß
Don06
-
@Svolf: Kauf Dir ein Buch über C/C++ mit 50 Euro bist Du dabei. Ich habe die Lösung auch nicht gewußt. Im Buch war sie abgedruckt.
***DevC++4.0*** 8 untitled1.cpp syntax error before `;' 21 untitled1.cpp `ofstream' undeclared (first use this function) 21 untitled1.cpp (Each undeclared identifier is reported only once 21 untitled1.cpp for each function it appears in.) 21 untitled1.cpp parse error before `;' 22 untitled1.cpp `dataus' undeclared (first use this function) 34 untitled1.cpp `ifstream' undeclared (first use this function) 34 untitled1.cpp parse error before `;' 35 untitled1.cpp `datin' undeclared (first use this function) 45 untitled1.cpp parse error before `++' ***BCB5.5*** Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland src\main.cpp: Error E2450 src\main.cpp 21: Undefined structure 'ofstream' in function speichern() Error E2449 src\main.cpp 21: Size of 'dataus' is unknown or zero in function speichern() Error E2450 src\main.cpp 21: Undefined structure 'ofstream' in function speichern() Error E2315 src\main.cpp 22: 'open' is not a member of 'ofstream', because the type is not yet defined in function speichern() Error E2094 src\main.cpp 23: 'operator<<' not implemented in type 'ofstream' for arguments of type 'Daten *' in function speichern() Error E2315 src\main.cpp 24: 'close' is not a member of 'ofstream', because the type is not yet defined in function speichern() Warning W8080 src\main.cpp 25: 'dataus' is declared but never used in function speichern() Error E2450 src\main.cpp 34: Undefined structure 'ifstream' in function lesen() Error E2449 src\main.cpp 34: Size of 'datin' is unknown or zero in function lesen() Error E2450 src\main.cpp 34: Undefined structure 'ifstream' in function lesen() Error E2315 src\main.cpp 35: 'open' is not a member of 'ifstream', because the type is not yet defined in function lesen() Error E2094 src\main.cpp 41: 'operator>>' not implemented in type 'ifstream' for arguments of type 'Daten *' in function lesen() Error E2315 src\main.cpp 43: 'eof' is not a member of 'ifstream', because the type is not yet defined in function lesen() Error E2378 src\main.cpp 45: Do-while statement missing ; in function lesen() Error E2315 src\main.cpp 46: 'close' is not a member of 'ifstream', because the type is not yet defined in function lesen() Warning W8004 src\main.cpp 48: 'z' is assigned a value that is never used in function lesen() Warning W8080 src\main.cpp 48: 'datin' is declared but never used in function lesen() *** 14 errors in Compile *** ***MSVC++6.0*** --------------------Konfiguration: test - Win32 Debug-------------------- Kompilierung läuft... main.cpp main.cpp(21): error C2079: 'dataus' verwendet undefiniertes class 'basic_ofstream<char,struct std::char_traits<char> >' main.cpp(22): error C2228: Der linke Teil von '.open' muss eine Klasse/Struktur/Union sein main.cpp(23): error C2297: '<<' : Ungültig, da der rechte Operand vom Typ 'struct Daten [6]' ist main.cpp(24): error C2228: Der linke Teil von '.close' muss eine Klasse/Struktur/Union sein main.cpp(34): error C2079: 'datin' verwendet undefiniertes class 'basic_ifstream<char,struct std::char_traits<char> >' main.cpp(35): error C2228: Der linke Teil von '.open' muss eine Klasse/Struktur/Union sein main.cpp(41): error C2297: '>>' : Ungültig, da der rechte Operand vom Typ 'struct Daten [6]' ist main.cpp(43): error C2228: Der linke Teil von '.eof' muss eine Klasse/Struktur/Union sein main.cpp(45): error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'z' main.cpp(46): error C2228: Der linke Teil von '.close' muss eine Klasse/Struktur/Union sein Fehler beim Ausführen von cl.exe. main.obj - 10 Fehler, 0 Warnung(en) ***MinGW*** --------------------Configuration: cpp - Debug-------------------- Compiling... main.cpp main.cpp: In function `void speichern()': main.cpp:21: error: aggregate `std::ofstream dataus' has incomplete type and cannot be defined main.cpp: In function `void lesen()': main.cpp:34: error: aggregate `std::ifstream datin' has incomplete type and cannot be defined main.cpp:45: error: syntax error before `++' token main.cpp:37: warning: unused variable `int z' main.o - 5 error(s), 1 warning(s) ***CodeBlocks*** Project : Console application Compiler : GNU GCC Compiler (called directly) Directory : E:\cblocks\cpp\ -------------------------------------------------------------------------------- Switching to target: default Compiling: main.cpp main.cpp: In function `void speichern()': main.cpp:21: error: aggregate `std::ofstream dataus' has incomplete type and cannot be defined main.cpp: In function `void lesen()': main.cpp:34: error: aggregate `std::ifstream datin' has incomplete type and cannot be defined main.cpp:45: error: expected `;' before "z" Process terminated with status 1 (0 minutes, 8 seconds) 3 errors, 0 warnings
-
#include <cstdlib> #include <iostream> #include <windows.h> #include "conwnd.c" #include "conioex.h" #include <wincon.h> #include <string> #include <iomanip> #include <vector> #include <fstream> using namespace std; struct Daten { string Name; int Staffelnummer; float Schwimmzeit; float Radzeit; float Laufzeit; int Geschlecht; float Ergebnisse; }; Daten feld[10]; void speichern() { ofstream dat_aus; dateiname = "konfig.ini"; dat_aus.open(dateiname.c_str(), ios_base::out); dat_aus << feld << endl; dat_aus << feld[0].Name; dat_aus << feld[1].Name; dat_aus.close(); } void lesen() { ifstream dat_ein; dateiname = "konfig.ini"; dat_ein.open(dateiname.c_str(), ios_base::in); char zeichen; while (!dat_ein.eof()) { dat_ein.get(zeichen); cout << zeichen; } system("PAUSE"); dat_ein.close(); }
Toll schaut man sich nun die "ini" an sieht man (wenn man a(1 teilnehmer und b fürn 2 teilnehmer) in der ini ab ,...und das hier
0x449010
eine Adresse und was gibt er mir aus,.nur die adresse,...
-
Bei mir gibt er die Addresse und abb aus.
Wobei das bb am ![irgenwas].eof() liegt.
Grüße
-
Ja, ein Array kann implizit in einen (konstanten) Zeiger umgewandelt werden - und witzigerweise sind die IOStreams in der Lage, beliebige Zeiger auszugeben. (und da es keinen passenden Ausgabeoperator für 'Daten*' oder 'Daten[]' gibt, nimmt der Compiler das nächstliegende - und das ist der op<< für 'void*')
Wenn du die Inhalt des Arrays ausgeben willst, mußt du dir eine Schleife bauen:
for(int i=0;i<10;++i) dat_aus<<Daten[i].Name<<' '<<Daten[i].Staffelnummer<<...<<endl;
(die Leerzeichen dazwischen sind nötig, wenn du die Werte später wieder trennen willst)
PS: Ich bin immer noch der Meinung, du solltest die Adresse und Größe des zu lesenden/schreibenden Arrays als Parameter übergeben.
-
Naja wieso Parameter abgeben, wenn das Feld mit einmal gezogen werden soll,..
void lesen() { ifstream dat_ein; dateiname = "konfig.ini"; dat_ein.open(dateiname.c_str(), ios_base::in); char zeichen; for(int i=0;i<10;++i) { dat_ein.get(zeichen); zeichen << feld[i].Name << endl; } system("PAUSE"); dat_ein.close(); }
178 C:\Dokumente und Einstellungen\USER\Desktop\Triathlon1.1\main.cpp no match for 'operator<<' in 'zeichen << feld[i].Daten::Name'
Kann mir vielleicht jemand sagen was das bdeutet?
bzw, ist ja nett wen ihr mir hilft,.aber könnt ihr es bitte vorher testen?zudem mit meiner 1. Funktion (seite 1) er speichert ja,..nur das lesen immer ,..zudem wenn ich in der speicherfunktion dann die lesefunktion reinscripte liest er auch,.ich glaube es hat was mit dem Programm zu tuen,.das sich etwas verharckt oder so
-
Svolf schrieb:
Naja wieso Parameter abgeben, wenn das Feld mit einmal gezogen werden soll,..
Ganz einfach - mit Parametern bist du flexibler
zeichen << feld[i].Name << endl;
178 C:\Dokumente und Einstellungen\USER\Desktop\Triathlon1.1\main.cpp no match for 'operator<<' in 'zeichen << feld[i].Daten::Name'
Kann mir vielleicht jemand sagen was das bdeutet?
bzw, ist ja nett wen ihr mir hilft,.aber könnt ihr es bitte vorher testen?Ganz einfach - die angegebene Anweisung ist Käse - versuch's mal mit
feld[i].Name += zeichen
(oder noch einfacher - lies den Namen perdat_ein>>feld[i].Name;
ein ;)).zudem mit meiner 1. Funktion (seite 1) er speichert ja,..nur das lesen immer ,..zudem wenn ich in der speicherfunktion dann die lesefunktion reinscripte liest er auch,.ich glaube es hat was mit dem Programm zu tuen,.das sich etwas verharckt oder so
Dein Problem ist, daß er eben nicht das speichert, was er speichern soll.
std::string hat intern nur einen char* und einige Hilfsvariablen (für Größe und Kapazität) und verwaltet seine Zeichen in einem externen Speicherblock, den er per new[] angefordert hat. Wenn du den mit write() schreibst, erfasst du nur die internen Daten - und beim zum nächsten Leseversuch erhältst du den Zeiger auf die Position, wo deine Zeichendaten mal waren.
(das erinnert mich an die Schildbürger - die haben eine Kerbe in ihr Boot geritzt, um ihren im See versenkten Schatz wiederzufinden :D)Edit: Aber ich glaube, das habe ich schonmal ganz am Anfang versucht, dir zu erklären.
-
HI,...
ich schaff es einfach nicht. Ich sage es mal so, dass Programm läuft so ziemlich gut (außer kleine Bugs durch falsche Eingaben). Denn dieses Triathlonprogramm ist in kleines Projekt was ich zu meiner Ausbildung (2. Semester) machen soll.
Es funktioniert nur nicht die Speicher/ lesefunktion,..
Ich habe das Programm (mit headers etc..) hochgeladen,..und würde mich freuen, wenn jemand Zeit hätte sich das mal anzusehen,...
Es wäre echt nett, denn ich habe schon so viel versucht und in büchern/ forums gelesen,.ich bin da jetzt ratlos,.und ich weiß ihr habt da schon mehr ahnung davon,..dass mir jemand halt helfen kann ,..Link!
http://dateihoster.de/preview.php?file=0c1d5d5ab4b9060441ce0cbc1.rarIch würde mich freuen
mfg
Svolf
-
Ich könnte dir jetzt gerne nochmal alles vorbeten, was ich schon mehrfach erklärt habe, aber das erspare ich mir jetzt. Kauf dir lieber ein vernünfitges Buch, um die Grundlagen von C++ zu verstehen. (und lern lesen
- etwas, was ich von einem Studenten im zweitens Semester eigentlich erwarten würde)