C fwrite und mehrere streame

Sejaar

Lieutenant
Registriert
Juli 2008
Beiträge
858
Hallo,

evtl. kann mir ja jemand helfen und mir die Tomaten von den Augen nehmen. Ich hab folgendes Problem. Ich muss Daten aus einer Datei in eine andere Datei kopieren. Beide Dateien enthalten int-Zahlen in binärer Form ergo sind alle Daten-Streame im Modus "w+b". Wenn man daten aus dem einen Daten-Stream holt und wieder in diesem ablegen will, geht dies ohne Probleme. Wenn ich nun wie oben gesagt, zahlen aus der einen Datei in die andere Datei holen will, so schreibt fwrite in die 2. Datei nur Müll (Lange kette von I mit nem Dach drüber)
Code:
for (i =0; i<m; i ++) {
		fread(&temp, sizeof(int), 1, a);
		fwrite(&temp , sizeof(int), 1 , temp_file1);
}

temp ist nen integer der in der Funktion an anfang deklariert wurde, "a" ist eine Datei und temp_file1 ebenso. wenn ich anstelle von temp_file1 "a" nehme, so gehts. wenn ich jedoch "a" schließe und wieder freigebe, so will fwrite immernoch nix in temp_file1 korrekt schreiben. Die Variablenübergabe an "fwrite" ist btw korrekt. hat jemand erfahrungen im Umgang von mehreren Daten-Streamen gleichzeitig?

ich weiß nämlich überhaupt nicht mehr weiter...
 
Denke, da müsste man mehr Code sehen. Die Aufrufe sind jedenfalls richtig so. Aber die zu lesende Datei muss
man doch mit "r" öffnen, meinst du nicht? :E
 
Zuletzt bearbeitet:
das ist egal, ob r+ oder w+, bei r+ muss nur die datei schon vorhanden sein

Code:
void merge (FILE *a, int m, int n) {
	FILE *temp_file1, *temp_file2;
	int i, j, temp, elem1, elem2;
	fpos_t cur_pos;
	
	temp_file1 = tmpfile();
	temp_file2 = tmpfile();


	fgetpos(a, &cur_pos);
	/* Teilfolgen in Hilfsdaten kopieren */
	for (i =0; i<m; i ++) {
		fread(&temp, sizeof(int), 1, a);
		fwrite(&temp , sizeof(int), 1 , temp_file1);
	}
	for (i=m; i<n; i++){
		fread(&temp, sizeof(int), 1, a);		
		fwrite(&temp, sizeof(int), 1, temp_file2);
	}
... Rest ist irrelevant

vllt sollte ich noch erwähnen, dass das einlesen ohne probleme funktioniert! aber nicht das schreiben
 
Zuletzt bearbeitet:
Da sind reichlich potentielle Bugs drin. Prüfe die Rückgabewerte von fread() und fwrite() und dann gegebenenfalls
ferror() bzw feof(). Auch solltest du vielleicht mal gucken, ob n überhaupt größer ist als m.
 
die rückgabewerte sind korrekt. es handelt es sich hierbei um den merge-sort-algorithmus auf datei-basis (frag mich bitte nicht warum ich das machen muss...) aufjedenfall ist ie funktion teil der HA und es ist sichergestellt, dass m n korrekt liegen. Wie gesagt, das Programm funktioniert bis auf die fwrite... die werte werden korrekt eingelesen, nur wird etwas vollkommen falsches in den Datei stream geschrieben...
 
Zuletzt bearbeitet:
Was passiert denn, wenn du eine Konstante schreiben lässt? Und dann testweise mal die fread Aufrufe ganz weglässt.
 
Also fwrite funktioniert mit diesem Handle generell nicht?
 
jo, und ich hab schon versucht, alle anderen streame auszuhängen, aber es geht einfach nicht...ka worans liegt...
 
Dann wäre der Code für die tmpfile() Methode mal interessant.
 
Aber wenn die tmp-Datei am Programmende gelöscht wird, woher weisst du dann, dass er dort fehlerhafte Daten reinschreibt? Haste sie zur Laufzeit mit nem Hex-Editor geöffnet?
 
ich benutzt Visual-Studio (ja ich weiß...) und kann sehen was dort reingeschrieben wurde. Außerdem hatte ich vorher extra Datein dafür angelegt und die hatte ich mir angeguckt...

ich habs jetzt aber aufgegeben

werd meinen prof. wohl mal fragen.^^

schönen abend noch und danke aufjedenfall :-)
 
Also mir zeigt der in Visual Studio bei einem neuen Handle auch diese Í an. Das steht wohl standardmäßig immer dort. Die werden dann stückweise ersetzt, wenn man in die Datei schreibt.
Ich weiß auch nicht, ob du im Debugger das File-Handle aufgeklappt hast und bei _base geschaut hast? Weil nur dort taucht auch der Inhalt der Datei auf.
 
Zurück
Oben