c++ ifstream geht nicht bei String übergabe

Boneman

Grünschnabel
Hallo,

arbeitete mit VC++ .net MFC, wobei das ein allgemeines Problem ist.

Ich möchte eine Datei öffnen, ich habe eine Funktion der ich den Namen der Datei als String übergebe:

Code:
 void bitmap::gray(CString dateiname){
 ifstream is;
 // das geht nicht 
 is.open(dateiname.GetString(), ios_base::binary );
 if(!is){
	AfxMessageBox("Fehler beim Öffnen der Datei");
	}


// so gehts, wenn ich das direkt reinschreibe
 is.open("Dateiname", ios_base::binary );
 if(!is){
	AfxMessageBox("Fehler beim Öffnen der Datei");
	}
}

Ich hab absolut keine Ahnung was ich machen soll, ich hab das schon in ein CharArray umgewandelt doch das ging auch nicht.:confused:

Falls jemand Ideen oder Anregungen hat, bitte helft mir

Danke
 
Zuletzt bearbeitet:
Hi.

Wie heißt denn die Datei wirklich die du versuchst zu öffnen? Kann es sein das da unübliche (nicht-ASCII) Zeichen im Dateinamen sind? Benutzt du Unicode oder sogar MBCS?

Gruß
 
Ich denke mal ich benutze Unicode, der Dateiname lautet zb:

H-000-MSG1__-MSG1________-WV_062___-000008___-200503151245-__

Ich hab den mal in "test" geändert dann gehts, aber das eigentliche Problem bleibt WIESO?
Da ich gern den Dateinamem beibehalten möchte
 
Zuletzt bearbeitet:
Hab das Problem gefunden, es lag nicht am Dateiname, sondern daran das ich die Datei vorher erzeuge, und sie noch nicht da ist wenn ich sie öffnen möchte.

Nun folgt die daraus resultierende Frage:

Wie bau ich da ein "Wait" ein, ich würde es an der Stelle einbauen wo die Fehlermeldung kommt. Doch wie mach ich das?
 
Hi.

Erzeugst du die Datei in einem anderen Thread oder einem anderen Prozess?

Evtl. hast du nur vergessen die Datei zu schliessen?

Gruß
 
Ich lasse mir die Datei über ein externes Program erzeugen, das ich vorher über Shellexecute ausführe.

Danach warte ich jedesmal 500ms, dann gehts ohne Problme, wobei die Performence darunter leidet.
 
Ist der Code geheim? Du läßt dir aber auch alles aus der Nase ziehen :rolleyes:

Du könntest die ShellExecuteEx Funktion verwenden um dann ein Handle zum Process zu bekommen der gestartet wird. Dann könntest du mit WaitForSingleObject warten bis der Prozess beendet ist.

Gruß
 
Also hiermal die komplette Funktion wie sie zurzeit ist:
Code:
void CWavelet2PicDlg::OnBnClickedBpivview()
{
        CString channelArray[8]; //Array für die dekomprimierten Dateinamen
	
	/////////////////BMPHEADER in FormatData schreiben//////////////////
	CopyFile("bmpheader","formatdata.bmp",FALSE);
	////////////////////////////////////////////////////////////////////
	for(int segnr=1;segnr<=8;segnr++){
		channelArray[segnr-1] = decompress(checkr(),segnr);
		Sleep(500);
	}
	for(int segnr=1;segnr<=8;segnr++){
		m_bitmap.gray(channelArray[segnr-1],gammar);
		remove(channelArray[segnr-1]);
	}
}
diese sah vorher so aus:
Code:
void CWavelet2PicDlg::OnBnClickedBpivview()
	
{
	CString channelArray[8]; //Array für die dekomprimierten Dateinamen
	
	/////////////////BMPHEADER in FormatData schreiben//////////////////
	CopyFile("bmpheader","formatdata.bmp",FALSE);
	////////////////////////////////////////////////////////////////////
	for(int segnr=1;segnr<=8;segnr++){
		dechannel = decompress(checkr(),segnr);  // hier wir der Dateinamen und die Segmentnummer übergeben
		m_bitmap.gray(dechannel,gamma); // Hier wird die wiedergegebene Datei verarbeitet
		remove(dechannel);
	
}
die Funktion decompress ruft eine exe Datei auf und übergibt ihr den Namen der Datei die dekomprimiert werden soll, der Name der Datei übergibt die Funktion "checkr()".

Die Funktion decompress gibt einen CString zurück mit dem Namen der dekomprimierten Datei.

mit der Funktion gray(dechannel, gamma) wir dann die dekomprimierte Datei verarbeitet.

Mit ShellExecuteEx Funktion habe ich noch nicht gearbeitet, werde ich aber demnächst versuchen.

danke.
 
Ja, gut. Diese Funktionen hätten mich jetzt eigentlich nicht so wahnsinnig interessiert, sondern eher die Stelle wo die ShellExecute Funktion aufgerufen wird.

Gruß
 
Zurück