Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » zentrale Variable verliert Wert in for-Schleife?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
05.05.2005, 14:54 Uhr
Maks



Hier mein Programmcode:
Das Programm soll die angegebene Textdatei zeilenweise einlesen und alles in einen Zeilenstring schreiben, der durchnumeriert wird

C++:
Zeile [zaehler] [stringlaenge] = buffer;


So weit so gut, d.h. es funktioniert wunderbar.
nur wenn ich weiter unten

C++:
for (unsigned int i=0; i < buffer.length(); i++)

{
// cout << "Zeile [zaehler] [stringlaenge]: - - - - - -" << Zeile [zaehler] [stringlaenge]<< endl;
      Buchstabe [i] = (Zeile [zaehler] [stringlaenge].substr(i,1));
       cout << "Buchstabe "<< i << " :" << Buchstabe [i] << endl;
}


versuche die Buchstabe einzeln zu extrahieren, dann übersetzt der Compiler ohne Probleme
nur wird bei "cout" NICHTS angezeigt. Das komische ist nur, wenn man alles in der Form ausgibt:

Code:
Zeile cout << [6] [11];

dann wird alles korrekt ausgegeben.

An dem Gültigkeitsbereich der Variablen kann ja nicht liegen, da alle in main definiert sind (ich weiß, schlechter Programmierstil, wollte es aber ÜBERHAUPT mal zum Laufen bringen und dann in Proceduren umschreiben)

Es kann kein so großes Problem sein, aber ich komm einfach nicht drauf.
Für einen Hinweis wäre ich dankbar!


C++:
#include <iostream.h>
#include <fstream.h>
#include <string>

int main() {

static int zaehler=0;
static int stringlaenge;
//static int unsigned i=0;

static string Zeile [200][200];
static string Buchstabe [100];
//string Wort [100];

  ifstream fin("D:/Downloads_D/C++ 01.05.05/Working/whatever1.txt");
  string buffer;

  cout << "Hier der Inhalt der Datei:\n";

  while (fin.good())
    {
    getline(fin,buffer,'\n');

//    cout << "buffer: "<< buffer << " " << endl;

    zaehler=zaehler+1;
//    cout << "zaehler: " << zaehler << endl;
    stringlaenge = buffer.length();
//    cout << "stringlaenge: " << stringlaenge << " ";
    Zeile [zaehler] [stringlaenge] = buffer;
    cout << "Zeile "<< zaehler << " " << Zeile [zaehler] [stringlaenge]  << " ," << "stringlaenge: " << stringlaenge << endl;

    }

for (unsigned int i=0; i < buffer.length(); i++)

{
// cout << "Zeile [zaehler] [stringlaenge]: - - - - - -" << Zeile [zaehler] [stringlaenge]<< endl;
      Buchstabe [i] = (Zeile [zaehler] [stringlaenge].substr(i,1));
       cout << "Buchstabe "<< i << " :" << Buchstabe [i] << endl;
}


  cout << "\nEnde der Ausgabe\n";
  fin.close();
  return 0;
}




Code:
D:\Downloads_D\C++ 01.05.05\Working>bcc32 ZeichenLesen5.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
ZeichenLesen5.cpp:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

D:\Downloads_D\C++ 01.05.05\Working>ZeichenLesen5
Hier der Inhalt der Datei:
Zeile 1 Hello World ,stringlaenge: 11
Zeile 2 Predicable choice of output, eh?? ,stringlaenge: 33
Zeile 3  ,stringlaenge: 0
Zeile 4 26 ,stringlaenge: 2
Zeile 5 34 ,stringlaenge: 2
Zeile 6 36 ,stringlaenge: 2
Zeile 7  ,stringlaenge: 0
Zeile 8 schwarz Dutzend1 13,14,15 Kolonne2 ,stringlaenge: 34
Zeile 9 Hello World ,stringlaenge: 11
Zeile 10 Predicable choice of output, eh?? ,stringlaenge: 33
Zeile 11 Dutzend1 Dutzend2 passe 4 7 23 4,5,6,7,8,9 ,stringlaenge: 42
Zeile 12 neue Eingabe 00:47 Uhr ,stringlaenge: 22
Zeile 13 Hello World ,stringlaenge: 11
Zeile 14 Predicable choice of output, eh?? ,stringlaenge: 33
Zeile 15 abcdefghijklmnopqrstuvwxyz ,stringlaenge: 26
Zeile 16 Dutzend3 Dutzend2 0,1,2,3 ,stringlaenge: 25
Zeile 17 schwarz 27 30 4,5,6,7,8,9 Dutzend1 Dutzend2 Kolonne 2 ,stringlaenge: 53

Zeile 18 Dutzend2 Dutzend3 30 35 17 Kolonne3rot 24 18 Dutzend3 4,5,6,7,8,9 Kolon
ne3 ,stringlaenge: 74
Zeile 19  ,stringlaenge: 0

Ende der Ausgabe



Bearbeitung von 0xdeadbeef:

Die code-tags waren ein guter Anfang, aber cpp-tags sind besser, da gibts Synatxhighlighting.


Dieser Post wurde am 05.05.2005 um 16:57 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.05.2005, 17:03 Uhr
0xdeadbeef
Gott
(Operator)


Ich glaube, du hast eine Verschachtelung zu viel in deinen Arrays. Auf diese Art vergisst du nachher, wo du die strings hingeschrieben hast. Machs so:

C++:
#include <fstream> // standard-header ohne .h
#include <iostream>
#include <string>
#include <vector> // besseres array

using namespace std;

int main() {
  ifstream in("datei.txt");
  string zeile;
  vector<string> zeilen;

  while(getline(in, zeile))
    zeilen.push_back(zeile);

  for(size_t i = 0; i < zeilen.size(); ++i)
    std::cout << i << ": " << zeilen[i] << std::endl;
}


Was du jetzt wie durchnummerieren willst, ist mir nicht ganz klar, vielleicht kannstes etwas deutlicher erklären?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.05.2005, 18:57 Uhr
Maks



Also das mit dem Vector ist endlich mal ein klasse vereinfachender Vorschlag!
Hab ich sonst mit Google im ganzen Internet nicht gefunden.

Jetzt bleibt immer noch ein Problem, ich versuchs mal zu erklären:
Ursprünglich wollte ich die Text-Datei so einlesen, daß ich (reproduzierbare) Informationen
über die Zeilenanzahl und die Buchstabenanzahl in einer Zeile erhalte und das Ganze nur, weil ich die in den Zeilen enthaltenen Wörter oder Zahlen einzeln in ein Feld speichern möchte, um es weiter als Argument zum Abfragen zu verwenden.

Das ganze soll zu einem Roulette-Programm gehören, für das ich die letzte Benutzereingabe in die Textdatei hernehme (die lezte Zeile), also die Werte, auf die der Spieler setzt. Da sie ja mit der momentanen Lesemethode nur als String vorliegen, muß ich einzeln abfragen

- ob es wirklich die letzte Zeile dieser Text-Datei ist,
- wann das nächste Wort kommt (werd ich am Leerzeichen festmachen) und
- ob es eine Zahl oder ein String ist.

diese einzelnen Worte (oder Zahlen) müssen dann natürlich auch zur Weiterverarbeitung in einen String oder einen Int-Wert (dauerhaft zur Wiederverwendung) gespeichert werden.

Habs mal ein wenig überarbeitet:
Momentane Schwierigkeit ist allerdings noch ein laut Compiler fehlender Strichpunkt der in der Zeile:

C++:
Buchstabe [AnzahlBuchstaben] = Zeilenstring[AnzahlZeilen].substr(AnzahlBuchstaben,1));


was ist daran verkehrt?
oder gehts noch leichter?


C++:
#include <fstream> // standard-header ohne .h
#include <iostream>
#include <string>
#include <vector> // besseres array

using namespace std;

int main() {
  ifstream in("D:/Downloads_D/C++ 01.05.05/Working/whatever1.txt");
  string zeile;
  string Zeilenstring [100];
  string Buchstabe [100];
  vector<string> zeilen;

  while(getline(in, zeile))
    zeilen.push_back(zeile);

  for(size_t AnzahlZeilen = 0; AnzahlZeilen < zeilen.size(); ++AnzahlZeilen)
  {
      std::cout << AnzahlZeilen << ": " << zeilen[AnzahlZeilen] << std::endl;

//Zeilenstring [AnzahlZeilen] = zeilen[AnzahlZeilen];
//cout << "Zeilenstring [AnzahlZeilen] "<< Zeilenstring [AnzahlZeilen] <<endl;


    for (size_t AnzahlBuchstaben = 0; AnzahlBuchstaben < Zeilenstring[AnzahlZeilen].length(); AnzahlBuchstaben++)
    {
        Buchstabe [AnzahlBuchstaben] = Zeilenstring[AnzahlZeilen].substr(AnzahlBuchstaben,1));
        cout << "Buchstabe "<< AnzahlBuchstaben << " :" << Buchstabe [AnzahlBuchstaben] << endl;
    }

  }


}


Dieser Post wurde am 05.05.2005 um 19:01 Uhr von Maks editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.05.2005, 19:46 Uhr
Maks



ich habs:
es war nur eine Klammer zu viel:

C++:
Buchstabe [AnzahlBuchstaben] = Zeilenstring[AnzahlZeilen].substr(AnzahlBuchstaben,1));
Buchstabe [AnzahlBuchstaben] = Zeilenstring[AnzahlZeilen].substr(AnzahlBuchstaben,1);



vorläufige Endfassung:
jetzt sind den Buchstaben die Infos über jeweilige Zeilennummer und Anzahl der Buchstaben der jeweiligen Zeile zugeordnet.

Wenn man das noch einfacher schreiben kann...?


C++:
#include <fstream> // standard-header ohne .h
#include <iostream>
#include <string>
#include <vector> // besseres array

using namespace std;

int main() {
  ifstream in("D:/Downloads_D/C++ 01.05.05/Working/whatever1.txt");
  string zeile;
  string Zeilenstring [100];
  string Buchstabe [100][100];
  vector<string> zeilen;

  while(getline(in, zeile))
    zeilen.push_back(zeile);

  for(size_t AnzahlZeilen = 0; AnzahlZeilen < zeilen.size(); ++AnzahlZeilen)
  {
      std::cout << AnzahlZeilen << ": " << zeilen[AnzahlZeilen] << std::endl;

Zeilenstring [AnzahlZeilen] = zeilen[AnzahlZeilen];
cout << "Zeilenstring [AnzahlZeilen] "<< Zeilenstring [AnzahlZeilen] <<endl;


    for (size_t AnzahlBuchstaben = 0; AnzahlBuchstaben < Zeilenstring[AnzahlZeilen].length(); AnzahlBuchstaben++)
    {
        Buchstabe [AnzahlBuchstaben][AnzahlZeilen] = Zeilenstring[AnzahlZeilen].substr(AnzahlBuchstaben,1);
        cout << "Buchstabe "<< AnzahlBuchstaben << " :" << Buchstabe [AnzahlBuchstaben][AnzahlZeilen] << endl;
    }

  }


}



Soweit ich mit der "Suchen"-Funktion herausgefunden habe deckt diese Vektor-Lösung fast alle Probleme mit Datei auslesen ab.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.05.2005, 20:04 Uhr
Maks



und wie geht das mit Vektoren und in die Datei schreiben?

SO gehts scheinbar nicht:

C++:
#include <fstream> // standard-header ohne .h
#include <iostream>
#include <string>
#include <vector> // besseres array

using namespace std;

int main() {
  ofstream out("D:/Downloads_D/C++ 01.05.05/Working/schreiben.txt");
  string zeile;
  string Zeilenstring [100];
  string Buchstabe [100][100];
  vector<string> zeilen;

cin >> zeile;

    while(write(out,zeile))
    {
      zeilen.push_back(zeile);
    }

    for(size_t AnzahlZeilen = 0; AnzahlZeilen < zeilen.size(); ++AnzahlZeilen)
    {
       out << AnzahlZeilen << ": " << zeilen[AnzahlZeilen] << std::endl;
    }
}



DAS kam als Fehlermeldung:
------------------------------------------------------------------------------
DDownloads_D\C++ 01.05.05\Working>bcc32 TextSchreibenVector.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
TextSchreibenVector.cpp:
Error E2285 TextSchreibenVector.cpp 17: Could not find a match for 'write(ofstre
am,string)' in function main()
*** 1 errors in Compile ***
------------------------------------------------------------------------------
Ohne Vector hab ich schon eine Lösung gefunden, allerdings wollte ich ja in zwei Wochen ein Roulette-Programm fertig haben...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
06.05.2005, 11:12 Uhr
CaesarCortezz
minderer Student


naja mit deinem out liest du nur infos aus einer datei.
mit


C++:
ifstream inf("Hallo.txt");



kannst du dann lesen

mit

C++:
ofstream ofs("halo.txt");


kannst du schreiben


hf beim proggen
--
Thus spake the master programmer:

``When the program is being tested, it is too late to make design changes.''

Dieser Post wurde am 06.05.2005 um 11:18 Uhr von CaesarCortezz editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
06.05.2005, 11:20 Uhr
0xdeadbeef
Gott
(Operator)


Buchstaben und Strings sind was verschiedenes, auch wenn Visual Basic das gleich behandelt. Wie auch immer, wenn du den xten Buchstaben der yten Zeile haben willst,

C++:
char buchstabe = zeilen[y][x]; // Vorsicht - der Index ist 0-basiert. zeilen[0][1] gibt den zweiten Buchstaben der ersten Zeile.


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
06.05.2005, 11:48 Uhr
Maks




Zitat von 0xdeadbeef:
Buchstaben und Strings sind was verschiedenes, auch wenn Visual Basic das gleich behandelt. Wie auch immer, wenn du den xten Buchstaben der yten Zeile haben willst,

C++:
char buchstabe = zeilen[y][x]; // Vorsicht - der Index ist 0-basiert. zeilen[0][1] gibt den zweiten Buchstaben der ersten Zeile.



also irgendwie kam ich da mit Java besser zurecht
Hab mir gestern noch Stunenlang die Typumwandlung von String oder char nach Int angesehen, hab noch einiges zu lernen schätze ich!

Erst mal danke für die Antworten, das Schlimste ist, wenn man stundenlang an einer Stelle hängt und nicht weiterkommt, so wie im Einlese-Fall.l
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
06.05.2005, 12:04 Uhr
0xdeadbeef
Gott
(Operator)


Hm. In Java funktioniert das aber ähnlich, da wärs

C++:
Vector zeilen; // nachher Strings reinpacken
char buchstabe = ((String) zeilen.elementAt(y)).charAt(x);


bzw. seit 5.0

C++:
Vector<String> zeilen;
char buchstabe = zeilen.elementAt(y).charAt(x);


...wenn ich mich richtig erinnere.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: