Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 03, 2025 22:16

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: TXT Datei in 2D-Integer-Array (C++)
BeitragVerfasst: Mi Jun 29, 2011 20:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 10, 2011 19:00
Beiträge: 43
Programmiersprache: FreePascal , C++
Hallo liebe DGL Community!

Ich verfolge das Forum und benutze das Wiki nun schon eine ganze Zeit lang.
Desswegen ersteinmal ein großes Dankeschön an alle die hier mitwirken. Ihr habt mich über ein Jahr beschäftigt bis meine erste Frage aufkam.

Zu meiner Frage:
Ich versuche aus einer Textdatei welche wie folgt aussieht die Zahlen in ein 2D-int-array zu laden. Das funktioniert auch _relativ_ gut, nur dass einige Werte wie durch Zauberei immer die Gleichen (und somit falsch) sind.

Die Textdatei sieht folgendermaßen aus:

12 03 04 10 05 14 16
01 03 04 02 14 09 06
16 08 28 03 06 17 02
26 02 03 48 56 23 04
04 25 33 65 13 29 07
07 04 03 06 01 12 55
02 03 05 12 34 05 07

Die farbig markierten Zahlen nehmen später im Array einen konstanten Wert an, egal was in der Zeile steht.

Mein Code:

Code:
  1.  
  2. int array[6][6] = {{0},{0}};
  3.  
  4. void Tokenize(const string& str,
  5.                       vector<string>& tokens,
  6.                       const string& delimiters = " ")
  7. {
  8.     // Trennzeichen am Anfang überspringen
  9.     string::size_type lastPos = str.find_first_not_of(delimiters, 0);
  10.     // erstes gewolltes Zeichen finden
  11.     string::size_type pos     = str.find_first_of(delimiters, lastPos);
  12.  
  13.     while (string::npos != pos || string::npos != lastPos)
  14.     {
  15.         // Abschnitt finden und zum Array hinzufügen
  16.         tokens.push_back(str.substr(lastPos, pos - lastPos));
  17.         // Trennzeichen überspringen ( >"not_of"< )
  18.         lastPos = str.find_first_not_of(delimiters, pos);
  19.         // bis zum nächsten Trennzeichen suchen
  20.         pos = str.find_first_of(delimiters, lastPos);
  21.     }
  22. }
  23.  
  24. void LadeArray(string file)
  25. {
  26.     int zeichen = 0;
  27.     int zeile = 0;
  28.     unsigned int i;
  29.     ifstream f;
  30.     string str, buff;
  31.     vector<string> tokens;
  32.  
  33.     tokens.clear();
  34.  
  35.     f.open(file.c_str(), ios::in);
  36.     while (!f.eof())
  37.     {
  38.         getline(f, str);
  39.         Tokenize(str, tokens);
  40.  
  41.         zeichen = 0;
  42.  
  43.         for (i = 0; i < tokens.size(); i++)
  44.         {
  45.             buff = tokens.at(i);
  46.             array[zeichen][zeile] = atoi(buff.c_str());
  47.             zeichen++;
  48.         }
  49.         tokens.clear();
  50.  
  51.         cout << str << endl;
  52.         ++zeile;
  53.     }
  54.  
  55.     f.close();
  56. }


Ich benutze Code::Blocks als IDE mit dem GNU GCC Compiler.
Hoffentlich ist jetzt alles gasagt was für die Problemlösung von Bedeutung ist.

Schonmal ein Danke im Voraus!
Chapter


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jun 29, 2011 21:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Dein Array ist 6x6 aber die Textdatei enthält 7x7. Absicht?

Hier eine etwas kürzere Variante die ebenfalls die Zahlen ins Array einliest:
Code:
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. int array[7][7] = {{0},{0}};
  5.  
  6. int main() {
  7.     std::ifstream stream;
  8.     stream.open ("zahlen.txt", std::ifstream::in);
  9.     int j=0;
  10.     while (stream.good() && j<7) {
  11.         for (int i=0; i<7; ++i) {
  12.             stream >> array[ i][j];
  13.         }
  14.         ++j;
  15.     }
  16.     stream.close();
  17.  
  18.     // ausgabe
  19.     for (int j=0; j<7; ++j) {
  20.         for (int i=0; i<7; ++i) {
  21.             std::cout << array[ i][j] << " ";
  22.         }
  23.         std::cout << "\n";
  24.     }
  25. }

Der Wink mit dem Zaunpfahl ist das man aus einem istream (und damit auch der ifstream) eben nicht nur mit getline eine Zeile holen kann sonder auch z.B. Integer (oder float, etc) direkt lesen kann. Whitespaces dienen dabei automatisch als Trennzeichen und werden übersprungen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jun 29, 2011 22:15 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,

wenn die Array-Grenzen sowieso fest sind, warum dann nicht mit fscanf arbeiten?

Code:
  1. #include <cstdio>
  2.  
  3. int a[7][7];
  4.  
  5. int main() {
  6.    FILE* f = fopen ("77.txt","r");
  7.    for (int i=0; i<7; ++i)
  8.       fscanf (f, "%d %d %d %d %d %d %d\n", &a[i][0], &a[i][1], &a[i][2], &a[i][3], &a[i][4], &a[i][5], &a[i][6]);
  9.    fclose(f);
  10.  
  11.    for (int i=0; i<7; ++i) {
  12.       for (int j=0; j<7; ++j) {
  13.           printf("%d ", a[i][j]);
  14.       }
  15.       printf("\n");
  16.    }    
  17. }

_________________
Wenn Gauß heute lebte, wäre er ein Hacker.
Peter Sarnak, Professor an der Princeton University


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jun 30, 2011 06:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 10, 2011 19:00
Beiträge: 43
Programmiersprache: FreePascal , C++
Danke erstmal.
Ich hab jetzt in der Schule keine möglichkeit es zu testen, aber heute Abend sag ich bescheid wie's läuft.

Was mich aber interessieren würde ist warum es bei mir nicht funktioniert. Eure Lösungen zu sind zwar sicher besser aber warum meine nur bei der ersten Zeile nicht läuft wundert mich sehr.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jun 30, 2011 07:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Was mich aber interessieren würde ist warum es bei mir nicht funktioniert.

Coolcat hat geschrieben:
Dein Array ist 6x6 aber die Textdatei enthält 7x7. Absicht?

Dein Array ist zu klein....du schreibst irgendwo im Speicher rum....d.h. ggf überschreibst du deine eigenen Werte. Es könnte genauso passieren, dass dir das Programm mit einem Segfault abstürzt. Verlasse dich niemals darauf das externe Eingaben korrekt sind.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jun 30, 2011 10:50 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Coolcat hat geschrieben:
Dein Array ist 6x6 aber die Textdatei enthält 7x7. Absicht?

Die Vorteile von C++ sind, dass sowas geht.
Die Nachteile von C++ sind, das sowas geht!

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jun 30, 2011 18:10 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 10, 2011 19:00
Beiträge: 43
Programmiersprache: FreePascal , C++
OK. Jetzt hat sich alles geklärt.

Zitat:
Dein Array ist 6x6 aber die Textdatei enthält 7x7. Absicht?

Nein das war keine Absicht. Ich hab scheinbar das Zählen (oder tippen) verlernt. :oops: Wie peinlich!

Ich hätte wahrscheinlich alles nochmal zerstückelt um den Fehler zu finden. An die Arraydimensionen habe ich garnicht mehr gedacht.
Also danke nochmal.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]