struktur und eine Text Datei problem

justuslopas

Grünschnabel
hi.
muss fürs studium eine aufgabe erledigen. Und zwar hab ich eine textdatei wo in jeder zeile fogende Eintraege habe: Autor bis 50Zeichen, Titelbeginn(bis200Zeichen), Erscheinungsjahr, Preis
Jede Zeile soll nun in eine geeignete Struktur eingelsen werden und zeilenweise auf dem Monitor ausgegeben werden. Mein bisheriges Programm sieh unten, kann eine komplette Zeile auslesen aus der Datei, wollte aber doch nur den Autor erfassen und das ist mein Problem das ich nicht verstehe wie ich die einzelnen Sachen aus der Struktur ausgeben kann. Weiss jemand wie ich das machen könnte. Vielen Dank.

#include <stdio.h>
#include <string.h>
#define FELDER 30
#define AUTOR 50
#define TITEL 200

void eingabe(char ceingdatei[]);

main(){
FILE *fp;
char ceingabe[FELDER];
int ivergleich;
struct buch{
char Autor[AUTOR];
char Titelbeginn[TITEL];
int Jahr;
float Preis;
}buchdatei;

eingabe(ceingabe);
ivergleich= strcmp(ceingabe,"buch.txt");
while(ivergleich!=0){
printf("Fehler, Eingabedatei nicht gefunden\n\n");
eingabe(ceingabe);
ivergleich= strcmp(ceingabe,"buch.txt");
}
fp= fopen(ceingabe,"r");
if(fp!=NULL){
printf("\nDatei %s wurde geoeffnet!\n",ceingabe);
}
if(fgets(buchdatei.Autor,AUTOR,fp)!=NULL){
printf("Autor:%s",buchdatei.Autor);
}
else{
printf("Fehler beim lesen");
}

else{
printf("Fehler beim lesen");
}
}

void eingabe(char ceingdatei[]){

printf("Name der oeffnenden Datei:\n"); /* Eingabeaufforderung */
fflush(stdin);
gets(ceingdatei);
}
 
Wodurch sind denn die Einträge in der Zeile getrennt?

Könntest du übrigens bitte Codetags verwenden?
 

Anhänge

  • codetags.gif
    codetags.gif
    7,5 KB · Aufrufe: 143
egal

Gute Frage. Denke wenn ich eine leertaste dazwischen hab könnte es schwierig werden, da ja dann der Titel nicht richtig ausgegeben wird, denke mal mit einem Zeichen wie , oder ;
 
Ja, das wäre eine Idee. Dann kannst du die Datei zeilenweise einlesen und nach dem Trennzeichen suchen, um herauszufinden, wie die einzelnen Einträge lauten.
 
gut, aber nur ist die Frage wie ich das machen könnte. Problem ist ja wenn ich nichts eingebe für z.B. Autor dann soll er ja aufhören.

zum Verständnis schreib ich nochmal die Aufgabe hin so wie ich sie bekommen hab:
Bitte erstellen sie ein C-Programm, das als Kommandoaufrufparameter den Namen einer Datei hat.
In dieser Datei sollten je Zeile folgende Buch-Einträge stehen.(Ist der Datei-Eintrag nicht passend, soll das Programm an dieser Stelle mit dem weiterem Einlesen aufhören):
Autor(bis 50 Zeichen), Titelbeginn(bis 200 Zeichen), Erscheinungsjahr(ganze Zahl), Preis(reelle Zahl).
Jede Zeile soll ine eine geeignete Struktur eingelesen werden und zeilenweise auf dem Monitor ausgegeben werden. Als optionaler weiterer Kommandozeilenparameter kann die maximale Anzahl der Zeilen, die ausgegeben werden sollen, angegeben werden.
 
ja klar verstehe ich. nur wie kann ich aus einem vektor was vor dem Komma ausgeben, oder besser gesagt speichern, welche abfrage muesste ich machen.
 
Also, prinzipiell würde ich mich nicht auf Funktionen wie printf etc. verlassen, sondern die ganze Datei in einen char Puffer einlesen. Dann würde ich diesen Puffer durchgehen und auseinander bauen. Die einzelnen Angaben wie Autor, Preis etc. sind sicherlich durch einen Zeilenumbruch oder zumindest durch ein Leerzeichen in der Textdatei getrennt. Also:
Code:
fp= fopen(ceingabe,"r");

char puffer[65536];
//einfach mal 65536 bytes einlesen, müsste eigentlich klappen
fread(puffer,sizeof(char),65536,fp);

//so, nu is alles im puffer, jetzt wird's durchsucht, mal angenommen, is alles 
//durch zeilenumbrüche getrennt

int i = 0;
for (int position = 0; position < 65536; position++)
{
  if (puffer[position] == 0x0D) break;
  Autor[i] = puffer[position];
  i++;
}

//der nächste

position++;
if ((position < 65536) && (puffer[position] == 0x0A)) position++;
i = 0;

for (; position < 65536; position++)
{
  if (puffer[position] == 0x0D) break;
  Titel[i] = puffer[position];
  i++;
}
...

und so weiter...
So in der Art würde ich's vielleicht probieren. Kann man natürlich noch wesentlich eleganter lösen, aber mehr hab ich mir jetzt nicht zugetraut ohne es auszuprobieren :), hoffe es sind keine Fehler drin. Das ganze ist auch noch sehr festgelegt darauf, dass alles Zeile für Zeile in der Datei steht, ohne große Ausnahmen.
Ach ja, am Ende noch die Datenstruktur ausgeben.
 
Zurück