[c++ Lesen mehrerer Werte aus einer Textdatei und Array erstellen

guddy

Mitglied
Hallo,

ich möchte aus einer Datei einen Wert für die int Variable arrayheight auslesen. Danach soll damit ein zweidimensionales Array erzeugt werden. Danach soll das Array mit Werten gefüttert werden die zwei Zeilen unter arrayheight stehen.
Die eingabedatei sieht wie folgt aus:

Code:
arrayheight: 4

Variable_nr;lower_bound;upper_bound      
1;80;100
2;50;55
3;5;44
4;45;66

Der compiler spuckt einige folgender Fehlermeldungen aus:

Code:
C:29: error: no match for 'operator>>' in 'file.std::basic_ifstream<char, std::char_traits<char> >::<anonymous>.std::basic_istream<_CharT, _Traits>::operator>> [with _CharT = char, _Traits = std::char_traits<char>](((int&)(& varNr))) >> separator'

Kann es sein, dass die datentypen nicht übereinstimmen? im stream stehen ja eigentlich string oder char. Ich habe aber oGrenze, usw. als int definiert. Wenn ich sie jedoch als char definiere kommen ähnliche fehler...

Wo liegt mein Fehler?

Der Code:
C++:
#include <iostream>
#include <fstream>


int main()
{
   
    std::ifstream file("Variableninput.dat");
    if( !file.is_open() )
    {
        std::cerr << "Fehler beim Oeffnen" << std::endl;
        return -1;
    }
    file.ignore( std::numeric_limits< std::streamsize >::max(), ':' );
    size_t arrayHeigth;
    file >> arrayHeigth;

    std::string comment;
    file >> comment; //geht hier so einfach, da Var_nr;uGrenze;oGrenze ein Wort ist, ansonsten: file.ignore( std::numeric_limits< std::streamsize >::max(), '\n' ) )

    int varNr, uGrenze, oGrenze, arrayWidth;
    const char* separator = ";";
    int varArray[arrayHeigth] [arrayWidth];
    arrayWidth = 3;
   
    for (unsigned int i = 1; i <= arrayHeigth; i++)
    {       
    file >> varNr >> separator >> uGrenze >> separator >> oGrenze >> "\n";
    varArray [i] [1] = varNr; varArray [i] [2] = uGrenze; varArray [i] [3] = oGrenze;
    std :: cout << varArray [i] [1] << "\t" << varArray [i] [2] << "\t" << varArray [i] [3]<< "\n";
    }
}

Danke für eure Hilfe.

Guddy
 
Wer hat dir den denn geschickt? :D

Da sind sehr viele Fehler drin, aber vllt. guckst du einfach nochmal, was ich dir beim letzten mal geschrieben hab. Das war wenigstens ordentlich :D

C++:
#include <iostream>
#include <fstream>
Es fehlt <limits> u. <cstddef>

C++:
std::cerr << "Fehler beim Oeffnen" << std::endl;
Aktivier einfach die Deutschen Locals und schon gehen auch Umlaute.

C++:
size_t arrayHeigth;
Es heißt std::size_t.
C++:
    file >> comment; //geht hier so einfach, da Var_nr;uGrenze;oGrenze ein Wort ist, ansonsten: file.ignore( std::numeric_limits< std::streamsize >::max(), '\n' ) )
Ein std::getline(file, comment); hätte aber einfach mehr Stil.

UND JETZT KOMMEN NUR FEHLER:
C++:
int varNr, uGrenze, oGrenze, arrayWidth;
const char* separator = ";";
int varArray[arrayHeigth] [arrayWidth];
arrayWidth = 3;
(1) Wenn du in seperator einlesen willst, solltest du vllt. nicht const vor schreiben ;)
(2) arrayWidth und der Rest bekommen keine Ausgangswerte
(3) (2) führt zu einer undefinierten Größe von varArray[arrayHeight].
(4) Dynamische Größenangaben eines Arrays aufm Stack sind eine Erweiterung von C99 o. G++, d.h. es ist im Standard nicht erlaubt. Anstelle dessen wäre std::vector gut.
(5) Du legst eine andere arrayWidth (auf 3) nachm Anlegen des Array fest.
(6) Pack jede Var in eine struct und du hast Ordnung drin. (so wie ich es dir gepostet hatte)

C++:
for (unsigned int i = 1; i <= arrayHeigth; i++)
Jo das is in Delphi oder sonst ner komischen Sprache vllt. erlaubt, in C++ geht ein Array-Index aber bitte von 0 bis arrayHeight-1.

C++:
file >> varNr >> separator >> uGrenze >> separator >> oGrenze >> "\n";
varArray [i] [1] = varNr; varArray [i] [2] = uGrenze; varArray [i] [3] = oGrenze;
Hmm seperator ist konstant. Davon mal abgesehen ... warum ließt du das alles erst in temporäre Variablen ein? Davon mal abgesehen das deine Array-Indexe falsch sind :D
Und WAS soll dieses nach "\n" einlesen darstellen? :D Wo soll er es dir denn bitte hinschreiben?!
C++:
file >> varArray[i][0] >> seperator >> varArray[i][1] >> seperator >> varArray[i][2];


So sorry. Das ich jetzt so nen bissel arg unfreundlich war, liegt nur daran, dass du einfach dreist einen neuen Thread aufmachst und einen vollkommen beschissenen Quellcode postest, nachdem ich dir bereits einen gepostet hatte, der sauber war, usw. und du lediglich noch die Größe auslesen musstest. Für uns brauchst du keine Kommentare an den Code schreiben. Ich denk mal mit Filestreams sollte jeder umgehen können.
Vllt. sagst du beim nächsten mall einfach, dass du etwas bei dem Code nicht verstanden hast, und ob man dir es erklären kann oder sonstwas. Aber sowas ist verdammt DREIST!
 
Entschuldigt bitte,

ich hatte in mehreren Foren mein Problem gepostet. DevDevil, leider hatte deine gepostet Lösung beim compilieren sehr viele Fehler ausgespuckt. Da ich noch nicht so erfahren in c++ bin und der code für mich schwer zu verstehen ist, habe ich dann eine andere Lösung bevorzugt. Die schien mir einfacher, war aber anscheinend bullshit. :-)

Tut mir echt leid. Ich hätte dich wirklich fragen sollen.

Grüße

Guddy
 
Zurück