[c] fread() Programmabsturz

@deepthroat

Funktioniert nicht == Falsche Zeichen werden übertragen

Naja, der funktionierende Code ist:
C:
char path[256];
	sprintf(path,"%s.xyz",Ziel);
	FILE* target = fopen(path,"wb");
	FILE* f = fopen(Obj1,"rb");
	if(f == NULL) return -1;
	unsigned long i = 0;
	unsigned long j = 0;
	char temp[16];
	while(fgetc(f) != EOF) i++;
	printf("Dateigroesse: %d\n",i);
	fprintf(target,"%d:",i);
	while(j != i)
	{
		fseek(f,j,SEEK_SET);
		fread(temp,1,16,f);
		fprintf(target,"%c",temp[0]);
		j++;
	}
	fclose(f);
Der geht bis 10KB mit einer annehmbaren Geschwindigkeit. Alles darüber dauert Jahre.
Warum verwendest du nicht fseek + ftell zur Ermittelung der Dateigröße?
Weil ich zwei Dateien in eine schreiben möchte. Folgender Syntax:
Code:
<Bytes_der_ersten_Datei>:<Erste Datei><Zweite Datei>
Dann will ich die <Bytes_der_ersten...> durcharbeiten, bis die 2. anfängt.
Und, ja, ich weiss dass es so ein Thema gibt, ich möchte es aber selbst im c-Standard schreiben.

Was meinst du? Soll ich einen cString per fprintf() und '\0' - Terminierung oder fwrite() schreiben?

Gruss cwriter
 
Zuletzt bearbeitet:
Funktioniert nicht == Falsche Zeichen werden übertragen
Genauer?
Weil ich zwei Dateien in eine schreiben möchte.
Na und?! Warum kannst du dann nicht fseek+ftell nehmen?
Dann will ich die <Bytes_der_ersten...> durcharbeiten
Soll das heißen du willst alle Bytes aus der ersten Lesen?
Was meinst du? Soll ich einen cString per fprintf() und '\0' - Terminierung oder fwrite() schreiben?
Wenn es binäre Dateien sind auf jeden Fall fwrite.

Wie sheel schon sagte sind deine ganze fseek in der Schleife ziemlich unnütz. Du mußt doch nur Daten sukzessive lesen und schreiben....

Gruß
 
Endzeichen von cStrings (nicht initialisiert). Ich werde das Problem mal mit '\0' angehen.
Na und?! Warum kannst du dann nicht fseek+ftell nehmen?
Kann ich. Werde es mal versuchen. Die fgetc()-Variante gab mir einfach immer einen Eindruck, wie lange es gehen wird.
Soll das heißen du willst alle Bytes aus der ersten Lesen?
Es heisst, ich so viele Bytes lesen will, wie die <Bytes_der_ersten_Datei> (unsigned int) gross ist.
Wenn es binäre Dateien sind auf jeden Fall fwrite.
Ich bin immer noch verwirrt: Weshalb geht es, einen char zu schreiben, nicht aber einen char*? Oder liegt das nur an der '\0'? Soll ich dann einfach die Werte aus fread() übernehmen?

Wie sheel schon sagte sind deine ganze fseek in der Schleife ziemlich unnütz. Du mußt doch nur Daten sukzessive lesen und schreiben....
Ich hatte es mal ohne fseek(). Netterweise hat fread() sich nicht selbstständig vorgearbeitet -> Datei über 200MB.

Gruss
cwriter
 
Zuletzt bearbeitet:
Endzeichen von cStrings (nicht initialisiert). Ich werde das Problem mal mit '\0' angehen.
Das ist doch auch nur eine Umgehungslösung. Versuche das Problem zu verstehen und zu beheben.
Es heisst, ich so viele Bytes lesen will, wie die <Bytes_der_ersten_Datei> (unsigned int) gross ist.
Also die komplette Datei. Du mußt also nicht die Bytes zählen.

Ich bin immer noch verwirrt: Weshalb geht es, einen char zu schreiben, nicht aber einen char*? Oder liegt das nur an der '\0'?
Strings sind nunmal \0 terminiert. Wenn in den Daten aus der Datei aber selbst ein \0 Zeichen drin ist funktionieren Stringfunktionen (wie fprintf) nicht mehr, da sie bei dem ersten \0 abbrechen.
Ich hatte es mal ohne fseek(). Netterweise hat fread() sich nicht selbstständig vorgearbeitet -> Datei über 200MB.
Das lag sehr wahrscheinlich an deiner Vorgehensweise (keine Fehlerprüfung!).

Gruß
 
Zuletzt bearbeitet:
So. Ich habe jetzt mal eure Vorschläge übernommen:
C:
FILE* target = fopen(path,"wb");
	FILE* f = fopen(Obj1,"rb");
	if(f == NULL) return -1;
	unsigned long i = 0;
	unsigned long j = 0;
	char temp[1];
	fseek (f, 0, SEEK_END);
        i=ftell (f);
	printf("Dateigroesse: %d\n",i);
	fprintf(target,"%d:",i);

	while(j != i)
	{
		fread(temp,1,1,f);
		fwrite(temp,1,1,target);
		j++;
	}
	fclose(f);
Ergebnis: In der Datei Target steht die Grösse von f und Ì. Ì wird 1000 Mal geschrieben. Was mache ich falsch?

EDIT: Logisch, man sollte halt schon am Anfang beginnen zu lesen :rolleyes:

Soweit, so gut. Wie kann ich jetzt den Durchsatz vergrössern, ohne dass ich nicht initialisierte chars schreibe?
 
Zuletzt bearbeitet:
Soweit, so gut. Wie kann ich jetzt den Durchsatz vergrössern, ohne dass ich nicht initialisierte chars schreibe?
Du müßtest einfach mal die Rückgabewerte der Funktionen prüfen, wieviel gelesen und wieviel geschrieben wurde.
C:
int copy_to(FILE* src, FILE* dest) {
  char buf[1024];
  size_t read;
  size_t written;
  while ((read = fread(buf, 1, sizeof buf, src)) != 0) {
    written = fwrite(buf, 1, read, dest);
    if (written != read) {
      return 0;
    }
  }
  return (feof(src) && !ferror(src) && !ferror(dest));
}
Gruß
 
Zurück