mit Elementen eines Arrays rechnen und zu einem neuen Array zusammenfassen
-
Boah ich Danke euch!!!
Es klappt jetzt und ich bin super gluecklich.
merano und Skym0sh0 ich benutze Code::Blocks GNU CC Compiler.
merano:
"Den Benutzer zu nötigen das jedes Mal einzugeben ist ungesund und lästig!"Ja das ist definitiv richtig! Da hab ich leider noch keine andere Loesung gefunden.
Mein -weniger effiktives- Programm liest die txt-Dateien und gibt mir die Anzahl der darin gespeicherten Elemente (Zeilen und Spalten) aus .
Ich weiß nicht, wie sich das dynamisch gestalten lässt, da sich die Zeilen und Spalten pro txt-Datei ändern. Davon habe ich nämlich knapp 2000 DateienAber vielleicht lässt sich das ähnlich lösen wie das erste Problem....
Viiiielen Dank nochmal an ALLE.
-
Anfaenger_braucht_Hilfe schrieb:
merano schrieb:
"Den Benutzer zu nötigen das jedes Mal einzugeben ist ungesund und lästig!"
Ja das ist definitiv richtig! Da hab ich leider noch keine andere Loesung gefunden.
...
Aber vielleicht lässt sich das ähnlich lösen wie das erste Problem....Selbstverständlich lässt sich auch das lösen ...
Wie war das mir dem Appell an die Eigeninitiative ? Woran scheitert es ?
Ich schlage eine (oder zwei) Funktionen als Ersatz für die blöde Abfrage vor.
// cout << "Spaltenanzahl der ausgelesenen ODatei ein: "; // cin >> spalten; spalten = ZaehleSpalten(input);
Und als Anregung hier auch ein (billiger) Vorschlag:
size_t ZaehleSpalten(istream &input) { string line; size_t found, spalten; getline(input, line); // zeile lesen for(spalten=0; (found=line.find(" ")) != string::npos; spalten++) line = line.substr(found+1, string::npos); // restlichen Zeichen kopieren input.seekg (0, ios::beg); return spalten; }
Hoffe das mit den Zeilen bekommst Du selber hin!
-
@merano: Die rollenden Augen lieber bleiben lassen.
found=line.find(" ") != string::npos
Tut nicht, was es sollte. Da fehlen Klammern, die Vergleichsoperatoren binden stärker als die Zuweisungsoperatoren.
Das fällt mir sofort auf, weil ich den Fehler schon selber einmal gemacht habe, und dafür von Pi gerügt wurde. Irgendwas mit cin.get() und einem Vergleich.input.seekg (0, input.beg);
beg
ist ein statischer Member vonios_base
(und damit von ifstream), daher musst du so auf ihn zugreifen:ios::beg.
(o.ä.)
Das wiederum kam auch hier im Forum schon einmal vor, à lacin.irgendeinMember
. Ich glaube, es war Nathan.Außerdem sollte so eine Funktion keine Referenz auf
ifstream
, sondern aufistream
nehmen. Abstraktion wegen.Es ist deine Aufgabe, Code, der mehr als nur zwei Zeilen umfasst, zu testen. Sonst nützt es keinem, dass du ihn postest.
-
Arcoth schrieb:
Tut nicht, was es sollte. Da fehlen Klammern, die Vergleichsoperatoren binden stärker als die Zuweisungsoperatoren.
So soll es sein. Verbesserungen immer willkommen.
(Der Code war getestet und er schien das Richtige zu tun, aber ...)
Beim optimieren hat sich dann aber wohl doch ein potentieller Operatoren Rangfolge Unfall ereignet,
der bei der o.a. Testdatei zum gleichen Ergebnis führt und deshalb nicht aufgefallen ist.
Ich spendiere sicherheitshalber noch einen Satz Klammern. ->Code angepasst.Die anderen Bedenken teile ich nicht; sind aber möglicherweise sinnvoll und ich habe sie auch eingebaut.
Arcoth schrieb:
Es ist deine Aufgabe, Code, der mehr als nur zwei Zeilen umfasst, zu testen. Sonst nützt es keinem, dass du ihn postest.
Wenn ich das in zwei Zeilen geschieben hätte, wäre es nicht wirklich lesbar gewesen, oder gibt es
eine kürzere Lösung ?
-
Danke!
Hab eueren Post zu spät gelesen und es anders gelöst.
Funktioniert auchifstream Datei; Datei.open("Test.txt",ios_base::in); if (!Datei){ cout << "Datei kann nicht geoeffnet werden" << endl; } else{ vector<vector<double> > matrix; while (Datei) { string line; getline(Datei, line); istringstream iss(line); vector<double> values; copy(istream_iterator<double>(iss), istream_iterator<double>(), back_insert_iterator<vector<double> >(values)); if (values.size() > 0) matrix.push_back(values); } int zeilen; int spalten; zeilen = matrix.size(); spalten = matrix[0].size(); int int_werte[zeilen][spalten]; // ... // damit kann man nun auch weiter arbeiten
Trotzdem Danke fuer eure Ideen
-
Anfaenger_braucht_Hilfe schrieb:
Danke!
Hab eueren Post zu spät gelesen und es anders gelöst.
Funktioniert auchStimmt, funktioniert.
Einige Anmerkungen hätte ich dazu.
Die Memberfunktion open ist über, da der Konstructor das bereits erledigen könnte.
ifstream Datei("matrix.txt");
Statt
if(!Datei) { ...
wäre evtl besser:
if(!Datei.is_open()) { ...
Wenn man wissen will ob die Datei geöffnet werden konnte und
while(Datei.good()) { ...
wenn man Lesefehler oder eof erkennen will.
Das ist erheblich verständlicher und würde zuverlässlich auch mit älteren Compilern funktionieren.
Ältere Compiler bekommen einen void* zurück, ohne das der Compiler das erkennen würde.Die Zeile komplett einzulesen ist wirklich besser als das Gefrickel mit der for-Schleife und hält die Matrix konsistent.
Das Feld am Ende wird wohl garnicht mehr gebraucht.
// int int_werte[zeilen][spalten];
-
Uuuh Danke merano,
habe es gleich verbesserDas Feld am Ende wird gebraucht, aber wollte euch nicht mit Codes zumüllen
LG
-
Skym0sh0 schrieb:
Du wirst
std::vector<std::vector<int>> myarr(spalten, std::vector<int>(zeilen, 0));
nutzen.
Bin mir jetzt nicht ganz sicher, würden sich slices http://www.cplusplus.com/reference/valarray/slice/ erlauben?
-
Hi hab noch eine Frage
Der Code ist nur ein Test und macht demnach nichts besonderes. Darum geht es mir auch gar nicht.
Wichtig ist mir hierbei, dass die neuen Textdateien mit BILD1 BILD2 BILD3 oder
1BILD 2BILD ... die sollen nicht alle nur BILD heißen. Ich hab da ein paar Sachen ausprobier, aber bei mir kommt BILD ILD LD raus#include <stdio.h> int main(){ int zeilen = 10; int spalten =10; int Bild [zeilen][spalten]; int counter = 3; FILE *f; for (int Anzahl=0; Anzahl <= counter; Anzahl++){ for (int i; i<Anzahl; i++){ f = fopen((Anzahl+"BILD.txt"), "w"); //ich glaub hier liegt der Fehler if (f) { for(unsigned int x = 0; x < zeilen; x++) { for(unsigned int y = 0; y < spalten; y++) { fprintf(f,"%d ", Bild [x][y]); } fprintf(f,"\n"); } fclose(f); } } } }
-
Ja, der Fehler liegt daran.
1. Verwende nichts aus stdio.h! Den Header gibt es gar nichtin C++. Das ist C.
2. Mit + kannste keine Zahl an einen String hängen, es wird die Adresse vom Stringliteral genommen, Anzahl dazu addiert und dann die Stelle als String interpretiert. Verwende C++-Strings und to_string, da geht das.
-
Danke Nathan,
hab jetzt schon viele Varianten (mit zusaetzlichen Klammern, mit + und und und) versucht, aber der macht jetzt nur noch Fehlermeldungen
//... string s; ostringstream outStream; outStream << Anzahl; s = outStream.str(); f = fopen("BILD.txt",s, "w"); //...
-
Nutz nicht FILE, fopen oder sonst was mit f am Anfang. Das ist C!
Mit + kannste keine Zahl an einen String hängen [...] Verwende C++-Strings [...], da geht das.