PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c strings manipulieren, struct?



Partyqueen
11-08-2008, 16:11
Hallo zusammen...

HILFE!!! mit Cobol und VB komm ich ja zurecht- aber c scheint mir momentan den Garaus zu machen:mad:

Ich muss in C ein Programm schreiben, was eine Datei einliest, diese Daten verwerten und in einem anderen Format wieder ausgeben.

Da in dem Ausgabeformat fest definierte Werte drin sind und nur ein paar der ausgelesenen Werte dort zwischen gebastelt werden müssen, wollte ich mein Glück mit einem Struct versuchen.

Bei der Eingabe habe ich allerdings schon das Problem, dass die benötigten Werte nicht immer an der gleichen Stelle stehen- was sich jedoch anhand der ersten 3 Stellen der Zeile ausmachen läßt

zB:

if "001" dann mach Verarbeitung x

else
if "002" dann mach Verarbeitung y
else mach Verarbeitung z

...............

Wollte dann die entsprechenden Werte an die Stellen im Struct zuweisen und den dann ausgeben.
Zudem muss ich noch die Länge des kompletten Structs wissen und das in das Struct mit rein schreiben.

Meine Idee war nun, Zeilenweise einlesen, verarbeiten, ins struct schreiben. Struct in ein Array schreiben (als Rückgabewert erhalte ich ja die Länge des Structs) und dann in die Datei schreiben.

Das Struct wollte ich in der Header-Datei deklarieren und dort auch schon die feststehenden Werte zuweisen. Oder mach ich das in meiner .c-Datei?

Kann ich ein Struct einfach so schreiben?

Mein Coding sieht momentan wie folgt aus



#include "hinweise.h"
// Struct für DAS deklarieren

struct DAS {
char SatzLaenge [5];
char filler1 [12] ;
char StNr [18];
char Ufa [2];
char filler2 [2];
char Zeitraum [4];
char filler3 [8];
char DeDatum [8];
char filler4 [40];
char filler5 [8];
char filler6 [6];
char DeDatum2 [8];
char filler7 [60];
} Ausgabe;

struct EinSatz
{
char SB [3];
char Rest [253];
} Eingabe;

struct Ein_Um
{
char filler1 [8];
char Nr [4];
char Ergaenz [10];
char filler2 [234];

} Eingabe_Um;

// Datei-Pointer
static FILE *fInput, *fOutput;

signed long Einlesen()
{
char szBuffer[MAX_LEN];
long lRet;

// Prüfen und Öffnen der Dateien
lRet = CheckFiles();
if ( lRet == HW_SUCCESS)
{


//Vorlesen
fgets(szBuffer, MAX_LEN, fInput);


while ( !feof(fInput) )
{
// Lesen bis Ende
//Verarbeitung

??????????????????????????????????????????????????

// weiterlesen
Stream(szBuffer);
fgets(szBuffer, MAX_LEN, fInput);
}
// Gucken, ob noch was im Buffer drin ist, da im letzten String DateiEnde drin sein kann
if ( strlen(szBuffer) > 0 )
Stream(szBuffer);
fclose(fInput);
fclose(fOutput);
}

return lRet;
}


static size_t Stream(const char *szBuf)
//
// Schreiben mit Zeilenvorschub
//
{
fprintf(fOutput, "%s\n", szBuf);
return (strlen(szBuf) + 1);
}

static long CheckFiles(void)
{
fInput = fopen(HW_DAT, "r");
if ( fInput != NULL )
{
fOutput = fopen(T7W_DAT, "a");
if ( fOutput != NULL )
{
return HW_SUCCESS;
} else {
fclose(fInput);
return HW_T7W_FILE_ERROR;
}
} else {
return HW_HINWEIS_FILE_ERROR;
}
}

***** und meine HeaderDatei*************


#define _CRT_SECURE_NO_DEPRECATE 1 // Sicherheitswarnungen ausschalten

// falls Header-Datei mehrfach drin (durch include anderer Dateien), werden die hier nur eingefügt, wenn noch nicht vorhanden ANFANG
#ifndef __HINWEISE_H__
#define __HINWEISE_H__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

// Rückmeldungen der DLL
#define HW_SUCCESS 0
#define HW_HINWEIS_FILE_ERROR -1
#define HW_T7W_FILE_ERROR -2
#define MAX_LEN 256


// Namen von Dateien - Hinweise = EIngabe, G53 = Ausgabe
#define HW_DAT "HINWEISE"
#define T7W_DAT "G53"

// Prototypen
// Static, damit nicht von außen ansprechbar
static long CheckFiles(void);
static size_t Stream(const char*);
static void Init(const char*);
static signed long Einlesen();

// falls Header-Datei mehrfach drin, werden die hier nur eingefügt, wenn noch nicht vorhanden ENDE
#endif // __HINWEISE_H__

*********

Könnt ihr mir helfen? Sind Structs eine so gute Idee?
Hoffe, es war halbwegs verständlich.. =)

Lieben Dank

ContainerDriver
11-08-2008, 18:41
Hallo,

kannst du bitte dein Posting bearbeiten und für den Code die [code]-Tags verwenden, so macht es keinen Spaß das zu lesen :)