Aus Datei in 2d String schreiben.
-
Ok folgendes Problem habe ich.
Ich habe einen 2 Dimensionalen String und will aus ner Datei da rein schreiben.
#include <stdio.h> #include <stdlib.h> int highscore (void) { char einlesen[10][2]; /*Hier ist mein 2 Dim String. 10 Zeilen je 2 Elemente*/ int i=0; /*Eine Laufvariable für die Whileschleife*/ FILE *f= fopen("test.txt","r");/*Datei wird geöffnet im Lesemodus*/ /*Ok und hier gehts los. Die Weilschleife soll eigentlich das erste Element aus der Datei in die [0][0] Zeile lesen und das Zweite in die [0][1] Zeile. */ while (i<10)/ { fscanf(f, "%s", einlesen[i][0]); printf("Eingelesen %s %s\n\n", einlesen[i][0]); fscanf(f, "%s", einlesen[i][1]); printf("Eingelesen %s %s\n\n", einlesen[i][1]); i++; } fclose(f); return (0); } int main() { highscore(); }
Danke für eure Hilfe
Achso vielleicht noch als Hinweiße. Der Inhalt der Datei aus der gelesen werden soll:
109 peter 203 harald 303 frank 444 david 555 moslem 349 ted 232 hebel 332 lars 312 sophie 12 Patrick
-
fscanf(f, "%c", &einlesen[i][0]); printf("Eingelesen %c \n\n", einlesen[i][0]); fscanf(f, "%c", &einlesen[i][1]); printf("Eingelesen %c \n\n", einlesen[i][1]);
Dir ist schon klar, dass dies so nur einzelne Zeichen sind? Dein Code sagt nämlich, dass du einzelne Zeichen willst, deine Kommentare sind da nicht so eindeutig zu interpretieren.
-
#include <stdio.h> #include <stdlib.h> int main () { char einlesen[10][100]; int i=0; FILE *f=fopen("hallo.txt","r"); while (i<10) { fscanf(f, "%s", einlesen[i]); printf("\n%s",einlesen[i]); i++; } fclose(f); }
Wenn ich die Datei ausführe holt er mir die ersten 10 Wörter aus der Datei.
Analog wollte ich das jetzt auch machen nur habe ich ein 2 Dim String...oder sehe ich das Falsch?
Die Intention dahinter ist in der einen Dimension des Arrays [i][0] die ganzen zahlen zu haben. Und in [i][1]die ganzen Namen....
-
Aber nun denk mal nach, was für einen Typ in deinem ersten Programm einlesen[i][0] hat und in deinem zweiten Programm einlesen[i].
Du beschreibst (ungetestet):
char einlesen[10][2][100]; // Zehn Zeilen mit je 2 Spalten mit je 100 Zeichen // ... fscanf(f, "%s", einlesen[i][0]); printf("Eingelesen %s\n\n", einlesen[i][0]); fscanf(f, "%s", einlesen[i][1]); printf("Eingelesen %s\n\n", einlesen[i][1]);
Aber vermutlich möchtest du auch dies nicht. Du schreibst, dass du Namen und Zahlen trennen möchtest. Kann es sein, dass du letztendlich dieses hier suchst:
char name[100]; int zahl; fscanf(f, "%s %d", name, &zahl);
?
P.S.: Wenn du bei meinem Programm Speicherzugriffsfehler bekommst, vermute ich mal, dass die Datei nicht richtig geöffnet wurde. Prüf das mal.
P.P.S.: Ach, jetzt hast du das wegeditiert. Ich nehme mal an, das heißt, es hat sich geklärt.
-
Also in meiner 2. Datei habe ich ja 10 Strings ausgelesen also ganz viele character. In meiner neuen Datei weill ich ja eigentlich int und char im wechsel auslesen
Jedoch kann man doch auch zahlen einfach wie character behandeln und dann dachte ich les ich einfach alles in ein 2 Dimensionales Array so das die Zahlen und die Namen in getretten Spalten sind.
Warum ich das alles mache:Ich möchte einen Highscore schreiben.
In die Funktion soll eine Zahl (Anzahl der Züge) reinkommen als int und die soll in eine Liste eingetragen werden (Natürlich sortiert nach wenige Züge).
In der Liste sollen 10 Werte mit den Namen sein so dass also wenn einer neuer kommt der schlechteste rausfliegt...
Nach dem Einsortieren wird dann noch der Name abgefragt und dazu geschrieben.
Aber ich denke ich habe ein noch Grundlegendes Problem....ich komme mit Pointern und Adresse noch nicht zurecht...Ich werd mich glaub ich erstmal da reinlesen befor ich hier weiter mache.
Und eine Anmerkung: Wäre es vielleicht besser mit struc zu arbeiten und sich ne eigenen Typ zu machen? Wobei ich das erst diese Woche hatte und eigentlich ungern nutzen würde...zumal ich nichtmal mit Pointern klarkomme momentan....
Danke dir für deine Hilfe
P.S. Ja hat sich geklärt Dateiname war falsch
-
Odatas schrieb:
Aber ich denke ich habe ein noch Grundlegendes Problem....ich komme mit Pointern und Adresse noch nicht zurecht...Ich werd mich glaub ich erstmal da reinlesen befor ich hier weiter mache.
Gute Idee
. Man sollte immer wissen was man tut. Dies ist auch nicht so schwer, das hast du morgen raus.
Und eine Anmerkung: Wäre es vielleicht besser mit struc zu arbeiten und sich ne eigenen Typ zu machen? Wobei ich das erst diese Woche hatte und eigentlich ungern nutzen würde...zumal ich nichtmal mit Pointern klarkomme momentan....
Abstraktion ist fast immer besser. Aber mach erst einmal die Grundlagen. Es ist hier auch leicht möglich, ohne structs auszukommen.
P.S. Ja hat sich geklärt Dateiname war falsch :/[/quote]
-
Ok ich hab mich jetzt mit pointern auseinander gesetzt was nicht heißt das schon komplett verstehe.
Wenn ich ein Array habe und den Namen an der Stelle 5 des Arrays an die Stelle 6 schreiben will wie mach ich das am besten:
int a=5 int b=6; char name[10][20]; *name[b]=*name[a];
So funzt das ja nicht...das weiß ich auch...
Aber wie mach ich dass dann am besten?
Ich schätze mal das Problem ist hier das ich zwei Zeiger anspreche die es garnicht gibt oder sehe ich das falsch?
-
strcpy()
wenn du einen Null-Terminierten String hast, sonstmemcpy()
.
Schau mal: http://www.cplusplus.com/reference/clibrary/cstring/strcpy(name[b],name[a]);
-
Ok das klingt leicht und einfach aber ich würds für mein pointer Verstädnis gern mit pointern machen
Würde folgendes klappen?
Sagen wir ich habe einen Pointer mit Namen A initialisiert:int a=5 int b=6; char name[10][20]; *A=&name[a]; name[b]=A;/*Oder müsste es "=*A" sein? */
-
name[5] ist die Adresse von name[5][0] (also &name[5][0]). Das ist kein Zeiger.
Darum kannst du den Wert nicht verändern, da du ja ein Array hast.
-
scanf("\nBitte Name eingeben:\n\n %s",name[i]);
Wie müsste das den jetzt richtig sein?
Ich will das der User hier nach seinem Namen gefragt wird und dieser dann in das i te Element geschrieben wird ...
Edit:
Natürlich so
printf("Bitte Namen eingeben"); scanf(" %s",name[i]);
Lol
-
So ich hab hier jetzt nochmal die Komplette Funktion. Vielleicht kann einer mal drüber schauen ob syntaktisch alles richtig ist oder irgend wo ein fehler ist der zwar zufällig das richtige macht aber es nicht immer müsste...
Hoffe ihr wisst was ich meine
Ziel war es eine Zuganzahl reinzuschieben in die Funktion und die liest eine bestehende Datei aus in der ein Highscore steht überprüft an welche stelle die neue Zugzahl muss und schreibt dann das wieder in eine Datei:
#include <stdio.h> #include <stdlib.h> #include <string.h> int highscore (int zug) { char name[10][20];/*String für die Namen*/ int zahl[10][1];/*String für die Zahlen*/ int i=0,p=0; /*Zählvariablen*/ FILE *f= fopen("higscore.txt","r");/*Highscore Datei öffnen*/ while (i<10)/*While Schleife liest Datei aus. Namen kommen in Namen String Zuganzahl kommt in das Zahl Array*/ { fscanf(f, "%d %s",zahl[i] ,name[i] ); printf(" Züge: %d", zahl[i][0]); printf(" Name: %s\n", name[i]); i++; } fclose(f);/*Datei schließen*/ i=9;/*Für die While schleife arbeite ich von hinten*/ p=i-1;/*Deshalb werden Variablen von hinten initialisiert*/ while(zug<zahl[i][0])/*So lange in der Zeile die Züge größer sind als die neuen züge*/ { zahl[i][0]=zahl[p][0];/*Wird die Zahl ein weiter runter kopiert*/ strcpy(name[i],name[p]);/*Der Name auch*/ i--;/*Beide Variablen werden ein veringert*/ p--; } /*Durch die Abbruchbedingung der While schleife steht jetzt eine Zeile doppelt und zwar die Zeile bei der die Zahl zum letzten mal kleiner war*/ p=p+2;/*Die Variable wird auf die Zeile eingestellt hätte auch i=i+1 sein können*/ zahl[p][0]=zug;/*Der Zug wird an die Stelle geschrieben*/ printf("\n\n Bitte geben Sie Ihren Namen ein\n\n"); scanf("%s",name[p]);/* Der User muss hier seinen Nickname eingeben*/ i=0; while(i<10)/*Diese While Schleifegibt den Highscore noch einmal aus nachdem eingetragen wurde*/ { printf("\nZüge: %d", zahl[i][0]); printf(" Name: %s\n", name[i]); i++; } FILE *g = fopen("higscore.txt","w");/*Datei wird wieder geöffnet. Alte Datei wird gelöscht*/ i=0; while(i<10) { fprintf (g, "%d %s " ,*zahl[i], name[i]);/*Neue Highscore Liste wird reingeschrieben*/ i++; } fclose(g); return(0); } int main() { int zug=400; highscore(zug); }
Ein Problem sehe ich selbst noch...und zwar dass diese Funktion so noch nicht auf den ersten Platz schreiben könnte(Letzten bin ich mir grad nicht sicher)
Wobei ich jetzt kein Bock mehr habe und man dass mit einer einfachen if Abfrage machen kann.
Danke und Gruß
-
Arbeite an deinem Einrückungsstil. Unbedingt! Es ist sehr anstrengend deinen Code zu lesen.
Was soll dennint zahl[10][1]; /*String für die Zahlen*/
?
Dafür nimmt man doch int zahl[10]; /*Array für die Zahlen
Da ändert sich noch was mit den Adressen:fscanf(f, "%d %s",&zahl[i] ,name[i] ); //und fprintf (g, "%d %s " ,zahl[i], name[i]);/*Neue Highscore Liste wird reingeschrieben*/
^Ich hoffe ich habe alle gesehen^
Und die while (i<10) -Schleifen solltest du als for-Schleifen schreiben, da du eine definierte Anzahl an Werten durchgehst.