C++ - For-Schleife läuft nur einmal korrekt durch?!?

Diskutiere C++ - For-Schleife läuft nur einmal korrekt durch?!? im Developer Network Forum im Bereich Hardware & Software Forum; Servus zusammen, ich hänge mal wieder und verzweifel fast an meinem Code. Ohne viele Worte, dafür mit Code und endprodukt... erst der...
  • C++ - For-Schleife läuft nur einmal korrekt durch?!? Beitrag #1
Lambo-Benni

Lambo-Benni

Bekanntes Mitglied
Dabei seit
23.03.2007
Beiträge
7.601
Reaktionspunkte
3
Ort
Medizinmanndiscount
Servus zusammen,

ich hänge mal wieder und verzweifel fast an meinem Code.
Ohne viele Worte, dafür mit Code und endprodukt...

erst der Codeschnipsel:
Code:
for (j=0;j<count;j++)
  {
    datei1 = svg[j];
    file.open (datei1.c_str(), ifstream::in);
	cout << endl << "Welche Datei wird durchsucht?  " << datei1 << "   j = " << j << "   z = " << z << endl << endl;
	for (i=0;i<anzch;i++) 			// Datei durchsuchen
	  {			                         // nach Umlauten
	    ch = file.get();
	    suche[i] = ch;
	    if (suche[i] == 'Ã' )                                 // Ã = Umlaut
	      {
	        i = anzch;
			convert[z] = datei1;
	        z++;
	        cout << endl << "Es ist ein Umlaut enthalten." << endl << endl;
	      }
	    if (file.eof())				// Abbruch bei Dateiende
	      {
	        i = anzch;
	      }
		if (i == 1000)
		  {
		    i = 1;
	//		t++;
	// (91 mal das t)	cout << suche[i] << " " << t << " ";
		  }
	  }
	file.close();
  }

Nund die Ausgabe der Konsole:
Code:
Welche Datei wird durchsucht? s650s1.svg  j = 0 z = 0

Welche Datei wird durchsucht? s651s2.svg  j = 1 z = 0

Welche Datei wird durchsucht? s660s3.svg  j = 2 z = 0

Welche Datei wird durchsucht? test.svg  j = 3 z = 0

Welche Datei wird durchsucht? test3.svg  j = 4 z = 0

Wichtige Infos:
Umlaute (Ã) enthalten sind in allen Dateien außer der 1. (s650s1.svg).

Problem:
Die Schleife läuft nur einmal korrekt durch (z wird nicht hochgezählt - müsste es eigentlich, weil ja Umlaute enthalten sind) - kleine Fehlermeldung.

Könnt ohr mir vielleicht helfen? Ich feinde den Fehler einfach nicht.


Evtl. könnte ich den Teil
Code:
		if (i == 1000)
		  {
		    i = 1;
	//		t++;
	// (91 mal das t)	cout << suche[i] << " " << t << " ";
		  }
weglassen, aber dann müsste ich "anzch" höher setzen, was seltsamerweise nicht geht (ist bei mir integer). Wie könnte ich "anzch" denn noch höhere Zahlen zuweisen (bisher 52.000 - müsste allerdings in die Millionen gehen)?

Vielen Dankim Voraus für jede Hilfe.
 
  • C++ - For-Schleife läuft nur einmal korrekt durch?!? Beitrag #2
N

nic_power

Senior Moderator
Dabei seit
27.12.2000
Beiträge
7.838
Reaktionspunkte
2
Hallo,

Was möchtest Du denn überhaupt mit dem Code erreichen? Willst Du Umlaute in einer Datei zählen und/oder diese in "ae" etc. konvertieren?

Nic
 
  • C++ - For-Schleife läuft nur einmal korrekt durch?!? Beitrag #3
Lambo-Benni

Lambo-Benni

Bekanntes Mitglied
Dabei seit
23.03.2007
Beiträge
7.601
Reaktionspunkte
3
Ort
Medizinmanndiscount
Erstmal will ich die Dateien, die Umlaute enthalten in ein Array speichern (convert[z]), weil ich sie später weiterverarbeiten will (mit inkscape in .png-Dateien konvertieren). Wie viele Umlaute in einer Datei enthalten sind, ist mir egal, wichtig ist ob welche enthalten sind, deshalb bricht das Durchsuchen auch ab, sobald einer gefunden wird.

Der Fehler liegt in dieser FOR-Schleife. Aus irgend einem Grund geht er diese nur einmal korrekt durch!
 
  • C++ - For-Schleife läuft nur einmal korrekt durch?!? Beitrag #4
Lambo-Benni

Lambo-Benni

Bekanntes Mitglied
Dabei seit
23.03.2007
Beiträge
7.601
Reaktionspunkte
3
Ort
Medizinmanndiscount
Ich habe jetzt "i" und "anzch" asl "unsigned int" deklariert und "anzch = 90000" zugewiesen und es funktioniert - allerdings darf ich nicht über die 90000 kommen (hab's mit 92000 getestet), sonst hängt sich der (G++-) Compiler auf.

Hauptsache es funktioniert.

Jetzt habe ich aber noch ein anderes kleines Problemchen:

mein (so funktionierender) Code:

system("C:\\programme\\inkscape\\inkscape -f C:\\test3.png.svg -e C:\\test3.pngb");


Die farbig hervorgehobenen Daten sollen per Variable zugewiesen werden (convert[j] und datei). Wenn ich aber einfach die Variablen in den Befehl schreibe, werden sie nicht als solche erkannt. Wie kann ich die Variablen mit dem "system()"-Befehl verwenden?
 
  • C++ - For-Schleife läuft nur einmal korrekt durch?!? Beitrag #5
WhiskeyCola16

WhiskeyCola16

Bekanntes Mitglied
Dabei seit
22.12.2001
Beiträge
971
Reaktionspunkte
1
Ort
Österreich
Kurz zum Wertebereich von int:
Der von int zu erfassende Wertebereich ist Systemabhängig. Ein int ist auf 32 Bit Systemen 32 Bit "groß". Heißt: -2^32 bis 2^32-1 was gleich bedeutend ist wie -2147483648 bis 2147483647.
Long entspricht oft einem 32 bit int.
Im .Net Bereich gibt es zB einen neuen Datentyp: Int64. Ein 64 bit int.
Ein unsigned int hat genauso 32 bit. Nur von 0 weg. Also 0 bis 2^32-1: 0 bis 4294967295.
Gut; so viel zu dem.
Ich würde in deinem Fall sowieso nicht die chars der Datei ermitteln bzw ins blaue schätzen, sondern einfach bis EOF durchgehen; außer ich finde einen Umlaut, dann abbrechen.
Zum system() Befehl: den string mit Hilfe von string Funktionen selber zusammenbauen, und dann system() damit aufrufen.
Übrigens: in der stdio.h gibt es die Funktion int rename(const char* alterDateiname, const char* neuerDateiname).
Befehle wie system(), welcher ja ein Windows eigener Befehl ist, würde ich vermeiden, um möglichst systemunabhängig zu sein.

[EDIT]
Außerdem liefert dir rename() schöne errors zurück wenn was nicht klappen sollte.
[/EDIT]

lg,
patrick
 
  • C++ - For-Schleife läuft nur einmal korrekt durch?!? Beitrag #6
N

nic_power

Senior Moderator
Dabei seit
27.12.2000
Beiträge
7.838
Reaktionspunkte
2
Hallo,

Zum system() Befehl: den string mit Hilfe von string Funktionen selber zusammenbauen, und dann system() damit aufrufen.

system() ist als Bibliotheksfunktion im Standard definiert und damit nicht systemabhängig. Allerdings sind alle Programme, die extern über system() aufgerufen werden, systemabhängig.

Prinzipiell kannst Du system() auch einen string (char array) übergeben.

Nic
 
  • C++ - For-Schleife läuft nur einmal korrekt durch?!? Beitrag #7
WhiskeyCola16

WhiskeyCola16

Bekanntes Mitglied
Dabei seit
22.12.2001
Beiträge
971
Reaktionspunkte
1
Ort
Österreich
Hab mich wohl unglücklich ausgedrückt. War so gemeint - aber das hat man davon, wenn man noch schnell vor der Mittagspause was schreiben will ;)
 
  • C++ - For-Schleife läuft nur einmal korrekt durch?!? Beitrag #8
Lambo-Benni

Lambo-Benni

Bekanntes Mitglied
Dabei seit
23.03.2007
Beiträge
7.601
Reaktionspunkte
3
Ort
Medizinmanndiscount
Hallo Patrick,

danke erstmal.

Zum system() Befehl: den string mit Hilfe von string Funktionen selber zusammenbauen, und dann system() damit aufrufen.

Danke, auf die Weise versuche ich es gerade. Das Problem dabei ist aber, dass "system()" keine "string" aufnimmt, sondern nur "const char*". Ich bastel mir also eine "string"-Variable mit dem kompletten Code und muss sie dann nur noch zu "const char*" umwandeln... ja, nur noch. :confused:

Im Code:
Code:
string a = "C:\\";
string xyz = "md " + a + "hallo";
system(xyz);
das funktioniert nicht


Code:
const char* qwe = "md C:\\hallo";
system(qwe);
funktioniert, ist aber nicht mein Vorhaben


Code:
string a = "C:\\";
string xyz = "md " + a + "hallo";
const char* qwe = xyz;
system(qwe);
funktioniert leider wider nicht...
Gibt es da eine Funktion, mit der ich "string" in "const char*" umwandeln kann (ähnlich wie z.B. "strtoul")?



Übrigens: in der stdio.h gibt es die Funktion int rename(const char* alterDateiname, const char* neuerDateiname).
Befehle wie system(), welcher ja ein Windows eigener Befehl ist, würde ich vermeiden, um möglichst systemunabhängig zu sein.
Wenn es denn ums Umbenennen ginge... ich will die Dateien nicht umbenennen, sonder mit Hilfe von inkscape konvertieren.

Prinzipiell kannst Du system() auch einen string (char array) übergeben.
Hallo Nic,

das lese ich jetzt gerade erst...

Mit dem "char"-Array versuche ich es mal. Danke.

Edit: Leider wirft das nur noch mehr Komplikationen auf... zumindest für mich.
Wie kriege ich einen string in ein "char"-Array?
 
Zuletzt bearbeitet:
  • C++ - For-Schleife läuft nur einmal korrekt durch?!? Beitrag #9
WhiskeyCola16

WhiskeyCola16

Bekanntes Mitglied
Dabei seit
22.12.2001
Beiträge
971
Reaktionspunkte
1
Ort
Österreich
Ein const char* ist ein Zeiger auf das erste Zeichen eines char[]. Das Schlüsselwort const garantiert hier, dass das, worauf der Zeiger zeigt (das char[]) konstant bleibt, also nicht in der Funktion verändert wird. Somit ist die übergabe eines char[] statt char* kein Problem.

Aus einem string machst du mit Hilfe der Funktion c_str() ein char[]. Also:

Code:
charArray = datenString.c_str();
 
  • C++ - For-Schleife läuft nur einmal korrekt durch?!? Beitrag #10
Lambo-Benni

Lambo-Benni

Bekanntes Mitglied
Dabei seit
23.03.2007
Beiträge
7.601
Reaktionspunkte
3
Ort
Medizinmanndiscount
Aus einem string machst du mit Hilfe der Funktion c_str() ein char[]. Also:

Code:
charArray = datenString.c_str();
Funktioniert leider nicht... :confused:

Compilermeldung:
error: incompatible types in assignment of 'const char*' to 'char[150]'

habe jetzt:
Code:
string batch;
char convert[150];
convert = batch.c_str();
 
  • C++ - For-Schleife läuft nur einmal korrekt durch?!? Beitrag #11
WhiskeyCola16

WhiskeyCola16

Bekanntes Mitglied
Dabei seit
22.12.2001
Beiträge
971
Reaktionspunkte
1
Ort
Österreich
sorry, c_str() liefert ja einen char*. Du kannst aber zb (wenn du nicht mit Pointern arbeiten willst/es noch nicht gut kannst:

Code:
    string test = "pa";
    string test2 = "use";
    system((test+test2).c_str());
oder halt mit Hilfsvariable:
Code:
    string test = "pa";
    string test2 = "use";
    string ges = test+test2;
    system(ges.c_str());
 
  • C++ - For-Schleife läuft nur einmal korrekt durch?!? Beitrag #12
Lambo-Benni

Lambo-Benni

Bekanntes Mitglied
Dabei seit
23.03.2007
Beiträge
7.601
Reaktionspunkte
3
Ort
Medizinmanndiscount
Danke WhiskeyCola und nic_power: ihr habt mir sehr geholfen.

Hier der komplette Code des fertigen Programms (ich weiß, der Stil ist noch nicht sooo gut, aber hauptsache es funktioniert):

Code:
#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <windows.h>
using namespace std;

int main()
{

  string svg[255];
  int count;
  WIN32_FIND_DATA daten;

  HANDLE h=FindFirstFile("c:\\*.svg", &daten);
  if(INVALID_HANDLE_VALUE==h) return(1);

  do  
    {  
      // .svg-Datei?
      if (daten.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) 
      {        
      svg[count] = daten.cFileName;
	  count++;
	  } 
             
    }  while(FindNextFile(h, &daten));

string datei1, datei2, temp = ".svg";
string datei, batch1;
char ch;
string convert[99];
int pos, z = 0, j = 0;
unsigned int i, anzch = 90000;
char suche[anzch];
const char* conv;
ifstream file;
system("rd C:\\newPNG /s /q");
system("md C:\\newPNG");

for (j=0;j<count;j++)
  {
    datei1 = svg[j];
    file.open (datei1.c_str(), ifstream::in);
	cout << endl << "Datei wird durchsucht:\t" << datei1 << endl;
	for (i=0;i<anzch;i++) 			// Datei durchsuchen...
	  {			  
	    ch = file.get();
	    suche[i] = ch;
	    if (suche[i] == 'Ã' )		// ... nach Umlauten
	      {
	        i = anzch;
			convert[z] = datei1;
	        z++;
	        cout << "\tUmlaut gefunden.";
	      }
	    if (file.eof())				// Abbruch bei Dateiende
	      {
	        i = anzch;
	      }
	  }
	cout << endl;
	file.close();
  }
  
cout << "\n\n";
for (j=0;j<z;j++)
  {
    pos = convert[j].find ("png.svg");
    datei = convert[j];
    datei.replace(pos, 7, "png");
	cout << endl << "   * " << datei << "\twird gespeichert" << endl;
	batch1 = "C:\\programme\\inkscape\\inkscape -f C:\\" + convert[j] + " -e C:\\newPNG\\" + datei;
	conv = batch1.c_str();
	system(conv);
  }
cout << "\n\nPfad zu den gespeicherten Dateien: \tC:\\newPNG\\\n\n";
system("PAUSE");

}

Jetzt wird der Code natürlich noch ein wenig gesäubert, damit ich in einem halben Jahr immer noch durchblicke.
 
Zuletzt bearbeitet:
Thema:

C++ - For-Schleife läuft nur einmal korrekt durch?!?

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.179
Beiträge
1.579.172
Mitglieder
55.878
Neuestes Mitglied
Satan666
Oben