C Problem
-
Also ich hab da ne Aufgabe die ich alleine nicht schaffe.
Ich muss eine Text Datei einlesen und zwar ne Schülerliste in der zuerst der Vorname dann Nachname dann Adresse dann Geb. Datum.
Jetzt muss ich die Datei einlesen und dan den Nach und Vornamen und Wohnort in einer Zeile ausgeben.
Wie mache ich das ? Vielleicht mit einem Array?
BItte um Hilfe bin echt ratlos!
Danke im Voraus
Lukas
-
hey lukas ich werd es mal versuchen. dauert aber so ne halbe stunde wenn du geduld hast. bin selbst noch ein anfänger aber ich glaub das sollt ich hin kriegen.
-
ja das wäre super!
-
hallo lukas
ich hab das programm mit einer do while schleife geschrieben mit 12 schueler die anzahl der schueler kannst du aber beliebig ändern.wenn du es probierst richte dich brav nach den anweisungen.
Das Programm ist aber nicht fehlerfrei! wär schön wenn jemand das mit dem char *a = vorname ... usw. verbessert . weiß nicht genau wie man ein Namen einlesen kann. schaus dir erstmal an.
#include <stdio.h> main() { char*a="vorname"; char*b="nachname"; int geburtsdatum; int i=1; int x=1; int anzahl; anzahl = 12; printf( "\n \t========================\n" "\n \tS C H U E L E L I S T E \n" "\n \t========================\n"); printf("\n \tBitte druecken Sie eine belibiege Taste um zur Eingabe zu gelangen.\t \n"); getch(); printf("\n Bitte geben sie Vorname, Nachname, Geburtsdatum - in dieser Rheienfolge ein! \n Trennen sie bitte mit ein Kommer!!\n\n"); do{ printf("Bitte geben Sie den %i -ten Schueler/in ein!", i++); scanf("%s,%s,%i",&a,&b,&geburtsdatum); x++; } while(x<anzahl); system("pause"); }
lg hasso
-
Ich glaub ich hab mich falsch ausgedrückt...
Ich muss die Schülerliste im Programm einlesen und danach aus dieser die Adressen und Namen herausfiltern, ich dachte das da ein Array angesagt werde.
Bei der Angabe steht noch jede Zeile wird mit dem CarriageReturn(Enter) beendet. Ich denke mal man muss mit dem irgendwas anstellen!Gruß Lukas
-
naja, arrays würde ICH jetzt nicht nehmen, da du ja nicht weisst, wie viel da in der datei drinnsteht. aber wenn du die daten nur ausgeben musst, musst du sie ja eingentlich gar nicht speichern.
also einfach eine zeile (schätze mal, dass jeder datensatz ein einer zeile steht) einlesen, ohne geb. datum ausgeben und fertig^^
-
Hi Bruder !
Steht jeder Datensatz in einer eigenen Zeile ?
-
Hey Alter!!!
Ich war gerade auf der Suche nach einer geeigneten Übungsmöglichkeit zu den Themen Verkettete Listen, Dynamische Speicherverwaltung und eben dem Arbeiten mit externen Daten.
Also habe ich mal so ein Schülerverzeichnisprogramm (shit! ist das ein langes Wort) geschrieben.
Zu beachten:
- Die Schülerliste muss eine Textdatei sein. (.txt)*- Die letzte Zeile muss ein Zeilenumbruch sein! (Zwischen den einzelnen Datensätzen darfst du soviele leere Zeilen einfügen wie du willst.)
- Ein Datensatz (pro Datensatz eine Zeile!) muss wie folgt aussehen: Nachname, Vorname, Strasse Nr., Postleitzahl Ort, Geburtsdatum
(Man muss sich genaustens an dieses Schema mit den Leerschlägen und Kommata halten, wobei die einzelnen Elemente eigentlich irgendwie aussehen dürfen.-12. Februar 1978 und 12.02.1978 gehen z. B. also beide problemlos.)Bispiel für Datensatz:
Meier, Hans, Lagerstrasse 22, 4567 Riedwil, 12. Februar 1978Übrigens:
Warscheinlich mault dein Compiler wegen fopen() und gets(). Du musst entweder die sichereren Versionen gets_s() und fopen_s() benutzen oder du scheisst auf diese Unschönheit und stopfst dem Compiler folgendermassen das Maul:
Füge vor der Zeile #include "student_directory.h" #define _CRT_SECURE_NO_DEPRECATE ein.
(Das mit #define _CRT_SECURE_NO_DEPRECATE funktioniert wohl nur bei Visual C++ von Microsoft.)//* main.c *// #define _CRT_SECURE_NO_DEPRECATE #include "student_directory.h" #include <stdio.h> int main(void){ ...
//* main.c *// #include "student_directory.h" #include <stdio.h> int main(void){ char filename_of_directory[1024]; student *last_element_of_list; student *first_element_of_list; //Start screen printf( "+------------------------------------+\n" "| Student Directory - 1.00 |\n" "+------------------------------------+\n" ); //Get filename of the directory printf("Filename: "); gets(filename_of_directory); //Load data last_element_of_list=get_data(filename_of_directory); //Search first element of list for( first_element_of_list=last_element_of_list; first_element_of_list->before!=NULL; first_element_of_list=first_element_of_list->before ); //Display first member of the student directory printf( " \n" "FIRST MEMBER OF THE STUDENT DIRECTORY:\n" "--------------------------------------\n" "Surname: %s \n" "Forename: %s \n" "Street: %s \n" "House number: %s \n" "Post code: %s \n" "Domicile: %s \n" "Date of birth: %s \n", first_element_of_list->surname, first_element_of_list->forename, first_element_of_list->street, first_element_of_list->house_number, first_element_of_list->post_code, first_element_of_list->domicile, first_element_of_list->date_of_birth ); getchar(); return EXIT_SUCCESS; }
//*student_directory.h *// #include <stdio.h> #include <stdlib.h> #ifndef ___STUDENT_DIRECTORY___ # define ___STUDENT_DIRECTORY___ typedef struct _student{ char forename[256]; char surname[256]; char street[256]; char house_number[16]; char post_code[16]; char domicile[256]; char date_of_birth[11]; struct _student *next; struct _student *before; }student; student * get_data(const char *filename_of_directory){ FILE *f; char line[1024]; unsigned short line_readingposition; unsigned short item_readingposition; student *dataset_to_read; student *dataset_read_last=NULL; //Open file and check if an error occured f=fopen(filename_of_directory,"r"); if(!f){ printf("\nERROR: Could not open file!"); fflush(stdin); getchar(); exit(EXIT_FAILURE); } //Store the data in student-structs while(fgets(line,sizeof(line),f)){ if(line[0]!='\n'){ //(We don't want to read empty lines) dataset_to_read=(student *)malloc(sizeof(student)); if(!dataset_to_read){ printf("\nERROR: Not enough memory!"); fflush(stdin); getchar(); exit(EXIT_FAILURE); } //(The first element can't have an element before itself) if(dataset_read_last==NULL){ dataset_to_read->before=NULL; dataset_to_read->next=NULL; } else{ dataset_to_read->before=dataset_read_last; dataset_to_read->next=NULL; dataset_read_last->next=dataset_to_read; dataset_read_last=dataset_to_read; } //Read items line_readingposition=0; //Read surname item_readingposition=0; while(line[line_readingposition]!=','){ dataset_to_read->surname[item_readingposition]=line[line_readingposition]; dataset_to_read->surname[++item_readingposition]='\0'; line_readingposition++; } line_readingposition+=2; //Skip comma and blank //Read forename item_readingposition=0; while(line[line_readingposition]!=','){ dataset_to_read->forename[item_readingposition]=line[line_readingposition]; dataset_to_read->forename[++item_readingposition]='\0'; line_readingposition++; } line_readingposition+=2; //Skip comma and blank //Read street item_readingposition=0; while(line[line_readingposition]!=' '){ dataset_to_read->street[item_readingposition]=line[line_readingposition]; dataset_to_read->street[++item_readingposition]='\0'; line_readingposition++; } line_readingposition+=1; //Skip blank //Read housenumber item_readingposition=0; while(line[line_readingposition]!=','){ dataset_to_read->house_number[item_readingposition]=line[line_readingposition]; dataset_to_read->house_number[++item_readingposition]='\0'; line_readingposition++; } line_readingposition+=2; //Skip comma and blank //Read postcode item_readingposition=0; while(line[line_readingposition]!=' '){ dataset_to_read->post_code[item_readingposition]=line[line_readingposition]; dataset_to_read->post_code[++item_readingposition]='\0'; line_readingposition++; } line_readingposition+=1; //Skip blank //Read domicile item_readingposition=0; while(line[line_readingposition]!=','){ dataset_to_read->domicile[item_readingposition]=line[line_readingposition]; dataset_to_read->domicile[++item_readingposition]='\0'; line_readingposition++; } line_readingposition+=2; //Skip comma and blank //Read date of birth item_readingposition=0; while(line[line_readingposition]!='\n'){ dataset_to_read->date_of_birth[item_readingposition]=line[line_readingposition]; dataset_to_read->date_of_birth[++item_readingposition]='\0'; line_readingposition++; } //Save the address of the last stored element dataset_read_last=dataset_to_read; } } fclose(f); return dataset_read_last; } #endif
-
Ich habe zu wenig Platz für das Geburtsdatum vorgesehen. In meinem Code muss deshalb folgendes geändert werden:
typedef struct _student{ char forename[256]; char surname[256]; char street[256]; char house_number[16]; char post_code[16]; char domicile[256]; char date_of_birth[32]; //<-- Änderung struct _student *next; struct _student *before; }student;
-
Nenn "before" lieber "prev".