Pascal-String einlesen

Scal

Mitglied
Hallo alle zusammen,

ich hätte da mal eine Frage. Wie muss ich mir denn einen Pascal String vorstellen?
Am Anfang der Binärdatei befindet sich noch ein Integer, welcher angibt, wie viele Pascal-Strings in der Datei enthalten sind.

Ich weiß nicht wirklich wie ich das deuten soll. Ich versuch gerade das Ganze einzulesen bzw. die einzelnen Strings in eine Textdatei zu schreiben.


lg ALex
 
Hi

kannst du diese Datei herzeigen (nicht reinkopieren, sondern als Anhang)?
Dann sollte klarer werden, was da gemeint ist.
 
Hallo sheel - das würde mich auch interessieren ... find da im Internet irgendwie nix brauchbares :o .. also

ein Bsp wäre:

Datentyp Beschreibung


int Anzahl der in der Datei vorhandenen Pascal-Strings
int length1 - Länge des ersten Pascal-Strings
char[length1] 1. Pascal-String
int length2 - Länge des zweiten Pascal-Strings
char[length2] 2. Pascal-String

ein Bsp. wäre

length H A L L O
5(int) 48(char) 41(char) 4c(char) 4c(char) 4f(char)


Lg Wolfi
 
Zuletzt bearbeitet:
Also du hast keine Beipieldatei?

Dann geh ich mal von 4Byte-Littleendian-ints und einem reinen 1Byte-Zeichensatz aus,
davon, dass die int-Längen in der Datei stimmen,
und dass das Wort Pascalstring nur da ist, um es euch schwerer zu machen.
C-String triffts genau so gut.

Jedenfalls, hier etwas Code. Ungetestet.
C++:
#include<stdio.h>

char **einlesen(const char *filename, unsigned long *a)
{
	FILE *dat:
	char **ret;
	unsigned long b, i;
	char e = 0;

	dat = fopen(filename, "rb");
	if(dat == NULL) return NULL;

	*a = 0;
	if(4 != fread((void *)a, 4, 1, dat)) e = 1;
	if(NULL == (ret = (char **)malloc(sizeof(char *) * (*a)))) e = 1;
	if(e)
	{
		fclose(dat);
		return NULL;
	}

	for(i = 0; i < *a; i++)
	{
		b = 0;
		ret[i] = NULL;
		if(4 != fread((void *)(&b), 4, 1, dat)) e = 1;
		if(NULL == (ret[i] = (char *)malloc(b + 1))) e = 1;
		if(ret[i])
		{
			if(b != fread((void *)(ret[i]), b, 1, dat)) e = 1;
			ret[i][b] = '\0';
		}
		if(e)
		{
			if(ret[i]) i++;
			for(--i; i >= 0; i--) free(ret[i]);
			free(ret);
			fclose(dat);
			return NULL;
		}
	}

	fclose(dat);
	return s;
}

void freigeben(char **s, unsigned long a)
{
	for(--a; a >= 0; a--) free(s[a]);
	free(s);
}

...

char **s;
unsigned long count;
s = einlesen("datei.bin", &count);
if(!s) printf("Fehler\n");
else
{
	//s[...] sind Strings, insgesamt count Stück
}
...

freigeben(s, count);
s = NULL;
 
Danke dir mal für deine Hilfe .. ja als ob Programmieren lernen allein nicht schon schwer genug wäre :o ...
ich hab jetzt übrigens doch eine Beispieldatei :-) - siehe Anhang!

Die Aufgabe ist nun diese Datei einzulesen und den String in eine txt Datei zu schreiben. (Returnwert 0)

Es gilt dann noch folgende Fälle zu berücksichtigen.
Wenn der Befehl nicht mit genau 1 Parameter gestartet wird --> Returnwert 1

Falls die Binär- oder die Textdatei nicht geöffnet werden kann
"Error: file cannot be opened.\n" --> Returnwert 2

Falls das im ersten Kommandozeilen-Argument angegebene Binärfile keine Pascal-Strings ist enthält (0 am Anfang) oder ganz leer ist
"Error: source file is empty.\n" --> Returnwert 3


Wenn in der Binärdatei falsche Daten stehen (Länge stimmt nicht, etc.)
"Error: file is corrupt.\n" --> Returnwert 4

Falls kein weiterer dynamischer Speicher zur Verfügung steht
"Error: out of memory.\n" --> Returnwert 5

Ich wäre aber schon mal überglücklich wenn nur mal der Erfolgsfall klappt!

Lg Wolfi
 

Anhänge

Zuletzt bearbeitet:
Also, die Datei schaut zu 100% aus wie vorgestellt... :)
damit ist "Pascalstring" nur eine sinnlose Verkomplizierung
(na gut, können ja Pascalstrings sein, aber das Wort ist hier einfach unnötig)

Weitere Annahme: Deine Datei hat nicht mehr als 2GB.

Und eine Frage: Der Name der Binärdatei soll per CMD-Parameter übergeben werden, gut.
Aber der Name der Zieltextdatei nicht?

Und noch eine Frage: Eine der Fehlermeldungen ist, wenn einem der malloc-Speicher ausgeht.
Man könnte die Aufgabe auch ganz ohne malloc lösen (zwar ist es dann langsamer
als die Mit-Variante, aber auch einfacher).
Denkst du, dass ihr malloc verwenden müsst?

Und Frage 3: Soll das Ganze eigentlich eher C oder C++ werden?
malloc und fopen oder new und istream?
 
ah ok :) Programmiersprache ist c.
Zu malloc: da bin ich mir ziemlich sicher dass es so gemeint ist da wir im Moment alles mit dynamisch erweiterbaren speicher machen und auch gerade lernen, also fopen() und fclose(output). lg
 
Zuletzt bearbeitet:
@sheel
Weitere Annahme: Deine Datei hat nicht mehr als 2GB.
Falls du damit auf 32/64 ansprichts: http://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/Opening-Streams.html
Function: FILE * fopen64 (const char *filename, const char *opentype)
This function is similar to fopen but the stream it returns a pointer for is opened using open64. Therefore this stream can be used even on files larger then 2^31 bytes on 32 bit machines.

Please note that the return type is still FILE *. There is no special FILE type for the LFS interface.

If the sources are compiled with _FILE_OFFSET_BITS == 64 on a 32 bits machine this function is available under the name fopen and so transparently replaces the old interface.
Ist also ziemlich wurscht, da man einfach ein define anfügen kann.

Gruss
cwriter
 
Zurück