Binär einlesen/auslesen(fread, fwrite)

Danke!

Ahja, und in diesem Ordner wo die Angabe(uebung.c) ist, ist noch eine Datei drinnen...
"._uebung.c"(<--- ist sozusagen transparent) heißt die und wenn ich diese öffne, dann erscheinen komische Zeichen(✠  œ ). Da steht irgendwas mit apple drinnen macOx textcoding apple.com etc. :D.
Der Lehrer hat auch einen Mac-Laptop. Ist die Datei wichtig für die Übung?
 
Also mit Transparent meinst du vll Unsichtbar? Also guck mal ob die Datei noch da ist wenn du deine IDE wieder schliesßt. Vll ist es nur eine Auslagerungsdatei.
 
Ist noch immer da, aber glaub ist egal... Habs einfach vom Projekt ausgeschlossen.

Auf jedenfall hab ich jetzt angefangen diese Übung zu programmieren und es treten Fehler auf, die ich nicht finden kann:

Also, mein Problem:
Wenn ich das ganze mit scanf mache dann geschieht folgendes beim "Starten ohne Debugging": Ich kann och die anzahl der Termine eingeben und auch noch das Thema aber dann kommt: "'name des programms'.exe funktioniert nicht mehr".

Wenn ich das ganze mit gets mache dann geschieht folgendes beim "Starten ohne Debugging": Hier kann ich auch noch die Anzahl eingeben aber dann kommt:siehe Bild

Jetzt mal abgesehn von den Fehlern passt es den in etwa so wie ich es programmiert habe?

C++:
1. c-file(main):
#include "write_termin.h"
#include "w_binaer_file.h"
#include <stdio.h>

void main()
{
  char filename[MAX_LEN]="daten.dat";
	terminData* daten=NULL;
	int anz=0;

	printf("Geben Sie bitte die Anzahl Ihrer Termine ein:");
	scanf("%d",&anz);

	daten=write_termin(filename,anz);
	write_binaer_file(filename,daten,anz);

	free(daten);
}


2. c-file:
#include "write_termin.h"
#include <stdio.h>

terminData* write_termin(char filename[], int anz)
{
  terminData* daten=NULL;
	terminData* daten1=NULL;

	int n=0;

	daten=(terminData*)malloc(sizeof(terminData)* anz);
	if(daten != NULL)
	{
		daten=daten1;
		while(n<anz)
		{
			printf("Thema des Termins:\n");
			scanf("%s",&daten1->topic);
			//gets(daten1->topic);

			printf("Anfangsdatum des Termins:\n");
			scanf("%s",&daten1->start_date);
			//gets(daten1->start_date);

			printf("Enddatum des Termins:\n");
			scanf("%s",&daten1->end_date);
			//gets(daten1->end_date);
			
			printf("Wer nimmt teil?\n");
			scanf("%s",&daten1->user);
			//gets(daten1->user);
			
			printf("Priorität des Termins(HOCH, MITTEL, NIEDRIG:\n");
			scanf("%s",&daten1->priorität);
			//gets(daten1->priorität);
	    
			printf("Beschreibung des Termins:\n");
			scanf("%s",&daten1->description);
			//gets(daten1->description);
	    
			printf("Status des Termins(ERLEDIGT, OFFEN):\n");
			scanf("%s",&daten1->start_date);
			//gets(daten1->start_date);
			n++;
			daten1++;
		}
	}
	else
	{
	  printf("Memory allocation Failure!");
	}

	return(daten);
}


3. c-file:
#include "write_termin.h"
#include "w_binaer_file.h"
#include <stdio.h>

void write_binaer_file(char filename[],terminData* termindaten, int anz)
{
  FILE* outFile=NULL;

	outFile=fopen(filename,"wb");
  if(outFile != NULL)
	{
	  if(anz != fwrite(termindaten,sizeof(terminData),anz,outFile))
		{
		  printf("error during write of %d blocks",anz);
		}
	}
	else
	{
	  printf("File %s could not be opened",filename);
	}

	fclose(outFile);
}


1. h-file:

#ifndef _write_termin_h_
#define _write_termin_h_ 1

#define MAX_LEN 100

struct struct_termin
{
  char topic[MAX_LEN];
	char start_date[MAX_LEN];
	char end_date[MAX_LEN];
  char user[MAX_LEN];
	char priorität[MAX_LEN];
	char description[MAX_LEN];
	char state[MAX_LEN];
};

typedef struct struct_termin terminData;

terminData* write_termin(char filename[], int anz);

#endif

2. h-file:

#include "write_termin.h"
#ifndef _wbinaer_file_h_
#define _wbinaer_file_h_ 1

void write_binaer_file(char filename[],terminData* termindaten, int anz);

#endif
 

Anhänge

  • error.png
    error.png
    22,1 KB · Aufrufe: 18
Hi

da ist nichts "ohne Debugging"
Du bist nach wie vor im Debugmodus.

Hab mir nicht alles angeschaut, hast aber komische Pointersachen da drin.

write_termin:
Du allokierst etwas für daten, in daten1 ist derweil NULL.
Dann überschreibst du daten mit daten1.
Ergebnis: Beide sind NULL.
Dann verwendest du daten...

Vllt. solltest du sinnvollere Variablennamen geben?

Und im main freigeben, was wo anders angelegt wurde, ist unschön.
 
da ist nichts "ohne Debugging"
Du bist nach wie vor im Debugmodus.

Mh ok, ich habs nur so geschrieben da es beim Visual c++ 2008 auch so steht, aber ok egal.

write_termin:
Du allokierst etwas für daten, in daten1 ist derweil NULL.
Dann überschreibst du daten mit daten1.
Ergebnis: Beide sind NULL.
Dann verwendest du daten...

Vllt. solltest du sinnvollere Variablennamen geben?

Ok, hier hab ich einfach den 1. Wert wo "daten" daraufzeigt in daten1 zwischengespeichert, denn man muss ja ab den 1. Wert wo der Zeiger draufzeigt freigeben.

Und daten1 zeigt ja sowieso auf die gleichen Adresssen wie daten, denn es gibt ja nur ein "Reihe von Adressen" oder?

Zum scanf: scanf brauch ich eigentlich gar nicht da ich ja leerzeichen mit einlesen will...

Darum gets, aber dann kommt halt, die im Bild beschriebene Fehlermeldung.
 
Was in VS steht bedeutet, dass du das Programm nicht über den Debugger startest.
Kompiliert ist es aber dafür, sonst kommt nicht so eine Meldung.

Zum Rest: Keine Ahnung, was du da meinst.
Ich bleib dabei, dass du Unsinn mit deinen Pointern machst.

Beispiel
C++:
int a = 0;
int b = 0;

a = 123;
a = b;
Was steht jetzt in a und b?
0 und 0.

Zu "eine Reihe von Adresse":
Nö. Speicherverwaltung von Windows/Linux macht da nicht mit.

Mach ein Programm, das eine Zahl in ein int einliest
und dann Zahl und Adresse davon ausgibt.
Starte dieses Programm zweimal und gib verschiedene Zahlen ein.

Die ausgegeben Zahlen sind bei jedem Programm anders,
die Adresse wird aber gleich sein.
 
Ah ok, verstehe danke.

Ich hab nun die Zuweisung von daten und daten1 vertauscht jetzt kann man eingeben nur Problem ist... das 1. gets wird übersprungen warum?

Hättest du eine Idee wie ich die "Speicherstellen" im string so begrenze kann, dass ich im notpad++, wenn ich die .dat datei öffne nicht mehr die komischen I's sehe?
 
gets sind jetzt also wieder entkommentiert?
Bitte aktuellen Code.

Zu den Zeichen in Notepad:
So arbeiten fwrite/fread nun mal.
Einen Byteblock fixer Länge schreiben. Wenn der String nicht voll ist,
wird der Rest auch geschrieben.

Du könntest die Stringlänge als int vor dem String reinschreiben,
dann eben nur den tatsächlichen Inhalt,
und beim Auslesen über die Stringlänge eben feststellen,
wie viel gelesen werden muss.

Ganze struct in einem Befehl geht dann aber nicht mehr.
 
Ok, aktueller Code hier(mit gets, jup, aber das 1. gets wird irgendwie ignoriert und in topic einfach nichts drinnen, aber wenn cih am anfang 2 termine eingebe und beim 2. durchlauf also beim 2. termin da kann ich jetzt das topic eingeben):

C++:
1. c-file(main):
#include "write_termin.h"
#include "w_binaer_file.h"
#include <stdio.h>

void main()
{
  char filename[MAX_LEN]="daten.dat";
	terminData* daten=NULL;
	int anz=0;

	printf("Geben Sie bitte die Anzahl Ihrer Termine ein:");
	scanf("%d",&anz);

	daten=write_termin(filename,anz);
	write_binaer_file(filename,daten,anz);

	free(daten);
}


2. c-file:
#include "write_termin.h"
#include <stdio.h>

terminData* write_termin(char filename[], int anz)
{
  terminData* daten=NULL;
	terminData* daten1=NULL;

	int n=0;

	daten=(terminData*)malloc(sizeof(terminData)* anz);
	if(daten != NULL)
	{
		daten1=daten;
		while(n<anz)
		{
			printf("Thema des Termins:\n");
			gets(daten1->topic);// hier "überspringt" er

			printf("Anfangsdatum des Termins:\n");
			gets(daten1->start_date);

			printf("Enddatum des Termins:\n");
			gets(daten1->end_date);
			
			printf("Wer nimmt teil?\n");
			gets(daten1->user);
			
			printf("Priorität des Termins(HOCH, MITTEL, NIEDRIG:\n");
			gets(daten1->priorität);
	    
			printf("Beschreibung des Termins:\n");
			gets(daten1->description);
	    
			printf("Status des Termins(ERLEDIGT, OFFEN):\n");
			gets(daten1->start_date);
			n++;
			daten1++;
		}
	}
	else
	{
	  printf("Memory allocation Failure!");
	}

	return(daten);
}


3. c-file:
#include "write_termin.h"
#include "w_binaer_file.h"
#include <stdio.h>

void write_binaer_file(char filename[],terminData* termindaten, int anz)
{
  FILE* outFile=NULL;

	outFile=fopen(filename,"wb");
  if(outFile != NULL)
	{
	  if(anz != fwrite(termindaten,sizeof(terminData),anz,outFile))
		{
		  printf("error during write of %d blocks",anz);
		}
	}
	else
	{
	  printf("File %s could not be opened",filename);
	}

	fclose(outFile);
}


1. h-file:

#ifndef _write_termin_h_
#define _write_termin_h_ 1

#define MAX_LEN 100

struct struct_termin
{
  char topic[MAX_LEN];
	char start_date[MAX_LEN];
	char end_date[MAX_LEN];
  char user[MAX_LEN];
	char priorität[MAX_LEN];
	char description[MAX_LEN];
	char state[MAX_LEN];
};

typedef struct struct_termin terminData;

terminData* write_termin(char filename[], int anz);

#endif

2. h-file:

#include "write_termin.h"
#ifndef _wbinaer_file_h_
#define _wbinaer_file_h_ 1

void write_binaer_file(char filename[],terminData* termindaten, int anz);

#endif
 
Zuletzt bearbeitet:
Zurück