[C] Schreiben einer Datei fehlerhalft

Bexx

Verrückte Erfinderin bei Daniel Düsentrieb
Hallo,

ich leider wieder.... Komme nicht weiter mit einem Programm das ich zu Lernzwecken zum Thema Dateispeicherung entworfen habe.

Hier erst mal der Code

Code:
#include "..\..\rebecca.h" // umfasst alle üblichen Bibliotheken

int main()
{
	int MAX = 100;
	FILE * fp;	// Pointer auf Datei deklarieren
	char * string;
	register short i =0, j = 0;
    
	// Speicher für string reservieren
	string = (char*)calloc(MAX, sizeof(char));
	
	printf("Bitte geben Sie einen Text ein, den Sie in eine doc Datei speichern moechten:\n");
	while (true)
	{
		if (j < MAX)
		{
			scanf("%c", &string[j]);    // Text einlesen
			if (string[j] == 10)
			{
				string[j] = '\0';		// string terminieren
				break;
			}
		j++;
		}
		else
		{
			char * temp;
			temp = string;
			string = (char*)calloc((MAX *2),sizeof(char));    //mehr Speicher reservieren, falls nötig
			if (string == NULL)
			{
				puts("Kein Speicher verfügbar!\n");		//Abbruchbedingung falls Zeiger auf NULL
				break;
			}
			for (int x = 0; x < MAX; x++)
			{
				string[x] = temp[x];
			}
		MAX= MAX * 2;			//Neue Größe von MAX definieren
		free(temp);				// Speicher wieder freilassen
		}
	}
	
	fp = fopen("test.doc", "w");		//Pointer auf Datei zuweisen
	if (fp == NULL)
	{
		printf("Operation nicht gelungen!\n");
	}
	while(!feof(fp)) 
	{
		fprintf(fp,"%c", string[i]);	//Zeichenweise einlesen
		if (string[i] == '!')
		{
			string[i+1]= '\0';			// nur bis zum ersten Auftreten eines ! beschreiben, danach beenden
			free(string);				// Speicher von String wieder freilassen
			return 0;
		}
		i++;
	}
	getch();
	exit (1);
}

Es will überhaupt nicht kompilieren, wenn ich mit calloc arbeite und wenn ich mit malloc arbeite sieht meine .doc Datei so aus:

HTML:
Das ist mein Text ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍýýýý««««««««            I  Øf; ¸w; X^  [           x   ýýýýBitte geben Sie einen Text ein, den Sie in eine txt Datei speichern moechten:
ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
und dieser ganze Müll ist über das komplette .doc verteilt.


Hat jemand eine Idee was ich falsch gemacht habe!?

---------------------------------------------------------------------------------------
Nehme alles zurück hab meine Fehler gefunden! :) Hab mir alles genau nochmal angesehen und habs dann auch direkt gesehen.
Nur eine Sache noch: Wie kann ich verhindern, dass das \0 in die Datei gespeichert wird?

Zu Nachschlagezwecken hier der fast richtige Code:):
Code:
// String in Datei reinschreiben.cpp : main project file.

#include "stdafx.h"
#include "..\..\rebecca.h" // umfasst alle üblichen Bibliotheken

int main()
{
	int MAX = 100;
	FILE * fp;	// Pointer auf Datei deklarieren
	char * string;
	register short i =0, j = 0;
    
	// Speicher für string reservieren
	string = (char*)calloc(MAX, sizeof(char));
	
	printf("Bitte geben Sie einen Text ein, den Sie in eine txt Datei speichern moechten:\n");
	while (true)
	{
		if (j < MAX)
		{
			scanf("%c", &string[j]);    // Text einlesen
			if (string[j] == 10)
			{
				string[j] = '\0';		// string terminieren
				break;
			}
		j++;
		}
		else
		{
			char * temp;
			temp = string;
			string = (char*)calloc((MAX *2), sizeof(char));    //mehr Speicher reservieren, falls nötig
			if (string == NULL)
			{
				puts("Kein Speicher verfügbar!\n");		//Abbruchbedingung falls Zeiger auf NULL
				break;
			}
			for (int x = 0; x < MAX; x++)
			{
				string[x] = temp[x];
			}
		MAX= MAX * 2;			//Neue Größe von MAX definieren
		free(temp);				// Speicher wieder freilassen
		}
	}
	
	fp = fopen("test.doc", "w");		//Pointer auf Datei zuweisen
	if (fp == NULL)
	{
		printf("Operation nicht gelungen!\n");
	}
	while(!feof(fp)) 
	{
		fprintf(fp,"%c", string[i]);	//Zeichenweise einlesen
		if (string[i] == '\0')
		{
			free(string);				// Speicher von String wieder freilassen
			return 0;
		}
		i++;
	}
	getch();
	exit (1);
}

Wäre toll, wenn jemand bezüglich des \0 eine Idee hätte....
 
Zuletzt bearbeitet:
Code:
			scanf("%c", &string[j]);    // Text einlesen
Das ginge auch einfacher mit getchar()

Code:
			string = (char*)calloc((MAX *2),sizeof(char));    //mehr Speicher reservieren, falls nötig
			if (string == NULL)
			{
				puts("Kein Speicher verfügbar!\n");		//Abbruchbedingung falls Zeiger auf NULL
				break;
			}
			for (int x = 0; x < MAX; x++)
			{
				string[x] = temp[x];
			}
Schau dir mal die Funktion realloc an.

Code:
	while(!feof(fp))
Diese Bedingung wird nie eintreten, da du nur in die Datei schreibst, aber nichts ausliest.

Code:
		fprintf(fp,"%c", string[i]);	//Zeichenweise einlesen
fputc wäre hier einfacher.

Code:
		if (string[i] == '!')
		{
			string[i+1]= '\0';			// nur bis zum ersten Auftreten eines ! beschreiben, danach beenden
			free(string);				// Speicher von String wieder freilassen
			return 0;
		}
		i++;
Was passiert, wenn in der eingegebenen Zeichenkette kein Ausrufezeichen auftaucht? Du solltest zusätzlich noch auf die Nullterminierung testen. Die Zeile string[i+1]= '\0'; ist zudem überflüssig. Alternativ könntest du auch Folgendes machen (statt der Schleife):
C:
  char *ausrufezeichen = strchr(string, '!');
  if (ausrufezeichen != NULL) *ausrufezeichen = '\0';
  fprintf(fp, "%s", string);
Schlussendlich hast du noch vergessen, die Datei wieder zu schließen (fclose).

Grüße, Matthias
 
Hi,

danke für deine Hilfe, hab den Quelltext jetzt geändert (bis auf realloc) und es funktioniert jetzt auch. Kein Mist mehr in der doc Datei :)

Merci!
 
Zurück