solareclipse
Cadet 2nd Year
- Registriert
- Nov. 2015
- Beiträge
- 19
Hallo zusammen,
ich wende mich mit einem Problem an euch, das mir schon länger Ärger bereitet und ich einfach keine Lösung hinbekomme. Ich habe bestimmt jetzt schon 10 stunden lang dieses scheinbar winzige Problem gegoogled, aber es ist keine Besserung in Sicht.
Vielleicht schafft ihr es ja mir zu helfen, Danke schonmal im Vorraus!
Also ich programmiere in C, mit Hilfe des Programms Eclipse. Ich bin neu in der Thematik und somit könnt ihr mir allemöglichen Tips und Tricks/Korrekturen und Anregungen sofort und unverblümt um die Ohren hauen.
Meine Aufgabenstellung ist folgende:
Ich habe eine Liste mit 44 Präsidenten der USA und soll die nach Vor- und Nachnamen mit Hilfe des Quicksort-Algorithmus sortieren. Ich habe die Vor- und die Nachnamen in einer Text-Datei vorliegen, jeweils für Vor- und Nachname 20 Characters in der Liste. Das Einlesen der Daten soll ausdrücklich mit dem fscanf-Befehl erfolgen, ich möchte also bitte keine Tipps haben, wie man es mit anderen Befehlen besser machen könnte.
Mein Problem ist, ich kriege die Daten nicht in eine Datenstruktur struct eingelesen. Bei der Ausgabe in der Konsole stelle ich fest, dass sich das Komma zwischen Vor- und Nachname in der Liste pro Zeile einen Leerschritt nach links verschiebt und so dann bald schon den ersten Vornamen "zerstört" und ein unheimliches Chaos nach sich zieht.
Ich werde zuerst meinen Code posten, dann einen Auschnitt, wie die Liste der Präsidenten aufgebaut ist und dann noch ein "Bild", das darstellt, wie die fehlerhafte Ausgabe bei mir in der Konsole aussieht:
Ausschnitt Liste der Präsidenten:
Ausgabe in der Konsole(Beachtet nicht die Nummern am linken Rand, nur so bleibt die Formatierung enthalten):
Eigentlich liegen zwischen den ausgegebenen Zeilen immer noch (warum auch immer?) zwei Leerzeilen, das habe ich jetzt aber aus Gründen der Übersichtlichkeit ausgespart.
Kann mir jemand sagen, warum sich dieses Komma da verschiebt und am Ende alles zerstört? Benutze ich den fscanf-Befehl überhaupt auf die korrekte Art und Weise?
Vielen Dank für die Bemühungen.
Freundliche Grüße
ich wende mich mit einem Problem an euch, das mir schon länger Ärger bereitet und ich einfach keine Lösung hinbekomme. Ich habe bestimmt jetzt schon 10 stunden lang dieses scheinbar winzige Problem gegoogled, aber es ist keine Besserung in Sicht.
Vielleicht schafft ihr es ja mir zu helfen, Danke schonmal im Vorraus!
Also ich programmiere in C, mit Hilfe des Programms Eclipse. Ich bin neu in der Thematik und somit könnt ihr mir allemöglichen Tips und Tricks/Korrekturen und Anregungen sofort und unverblümt um die Ohren hauen.
Meine Aufgabenstellung ist folgende:
Ich habe eine Liste mit 44 Präsidenten der USA und soll die nach Vor- und Nachnamen mit Hilfe des Quicksort-Algorithmus sortieren. Ich habe die Vor- und die Nachnamen in einer Text-Datei vorliegen, jeweils für Vor- und Nachname 20 Characters in der Liste. Das Einlesen der Daten soll ausdrücklich mit dem fscanf-Befehl erfolgen, ich möchte also bitte keine Tipps haben, wie man es mit anderen Befehlen besser machen könnte.
Mein Problem ist, ich kriege die Daten nicht in eine Datenstruktur struct eingelesen. Bei der Ausgabe in der Konsole stelle ich fest, dass sich das Komma zwischen Vor- und Nachname in der Liste pro Zeile einen Leerschritt nach links verschiebt und so dann bald schon den ersten Vornamen "zerstört" und ein unheimliches Chaos nach sich zieht.
Ich werde zuerst meinen Code posten, dann einen Auschnitt, wie die Liste der Präsidenten aufgebaut ist und dann noch ein "Bild", das darstellt, wie die fehlerhafte Ausgabe bei mir in der Konsole aussieht:
C:
#include <stdio.h>
#include <stdlib.h>
/*--------------------Variablendeklaration---------------------------------------------------------------------*/
typedef struct{
char vorname[21];
char nachname[21];
int position;
}spresident;
int i,zeilenzahl=1;
char Dateiname[30],c;
int abfrage;
spresident *president;
int main(void) {
/*-------------------------------------------------------------------------------------------------------------*/
/*--------------------1. Beginn Hauptprogramm------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------------------------------*/
/*--------------------1.1 Einlesen der Daten in die Struktur-Arrays-----------------------------------------------------*/
while (1){
/*-------------------------------------------------------------------------------------------------------------*/
printf("\n-----Bitte geben Sie den Namen der Datei an, aus der die Daten gelesen werden sollen:-----\n");
printf("-----zum Beispiel:inputdaten.txt-----\n");
scanf("%s",Dateiname);
printf("-----Der Name der Einlesedatei lautet: %s-----\n\n",Dateiname);
/*-------------------------------------------------------------------------------------------------------------*/
FILE *input;
input = fopen(Dateiname,"r");
if (input!=NULL){
//Anzahl Präsidenten
while ((c=fgetc(input))!=EOF){
if(c=='\n') {zeilenzahl++;}
}
rewind(input);
printf("Anzahl an Präsidenten: %d.\n",zeilenzahl);
//Speicherallokierung
president = (spresident*)malloc(zeilenzahl*sizeof(spresident));
if (president==NULL){
printf("Es konnte kein Speicherplatz für die Daten reserviert werden.");
}
/*--------------------!!!Relevanter Ausleseteil!!!------------------------------------------------------------------*/
//Werte zuweisen mit fscanf-Funktion.
for (i=0;i<zeilenzahl;i++){
fseek(input,i*41L,SEEK_SET); //==>ist unerheblich, ob eingesetzt oder nicht...warum auch immer...
fscanf(input,"%20c",president[i].vorname); //==>lese 20 character ein
fseek(input,1L,SEEK_CUR); //==>überspringe einen character, um zum nachnamen zu gelangen
fscanf(input,"%20c",president[i].nachname);
fseek(input,1L,SEEK_CUR); //==>überspringe einen character und damit in die nächste zeile
printf("%s,%s\n",president[i].vorname,president[i].nachname);
}
/*--------------------!!!Relevanter Ausleseteil(Ende)!!!------------------------------------------------------------------*/
fclose(input);
}
/*--------------------1.4 Aufgaben in Falle einer nicht vorhandenen Datei--------------------------------------*/
else {
printf("Datei konnte nicht geöffnet werden.\n");
printf("Drücken Sie die 1, um einen neuen Dateinamen einzugeben, oder die 2, um das Programm zu beenden.\n");
scanf("%d",&abfrage);
if (abfrage==1){
continue;
}
else if (abfrage==2) {
break;
}
else {
break;
}
}
/*-------------------------------------------------------------------------------------------------------------*/
break;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Ende Hauptprogramm mit While-Schleife.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
return EXIT_SUCCESS;
}
Ausschnitt Liste der Präsidenten:
HTML:
Gerald Ford
Jimmy Carter
Ronald W. Reagan
George H. W. Bush
Ausgabe in der Konsole(Beachtet nicht die Nummern am linken Rand, nur so bleibt die Formatierung enthalten):
HTML:
George ,Washington
John , Adams
Thomas , Jefferson
James , Madison
James , Monroe
John Quinc, Adams
Eigentlich liegen zwischen den ausgegebenen Zeilen immer noch (warum auch immer?) zwei Leerzeilen, das habe ich jetzt aber aus Gründen der Übersichtlichkeit ausgespart.
Kann mir jemand sagen, warum sich dieses Komma da verschiebt und am Ende alles zerstört? Benutze ich den fscanf-Befehl überhaupt auf die korrekte Art und Weise?
Vielen Dank für die Bemühungen.
Freundliche Grüße