Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » string und int kommagetrennt einlesen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
18.12.2003, 00:12 Uhr
lubU



Die Datei sieht wie folgt aus:

text1,200
text2,100
text3,50


C++:

char name1[20], name2[20], name3[20];
int punkte1, punkte2, punkte3;
FILE *datei;
datei = fopen("datei.sco","r");
        
fscanf(datei, "%s,%d\n", name1, punkte1);
fscanf(datei, "%s,%d\n", name2, punkte2);
fscanf(datei, "%s,%d\n", name3, punkte3);

fclose(datei);




wenn ich dann zb printf("%s", name1); mache
bekomme ich "text1,200" ausgegeben
für punkte1-3 bekomm ich irgendwelche zahlen zurück.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.12.2003, 01:02 Uhr
0xdeadbeef
Gott
(Operator)


Du musst ihm mitgeben, wohin er den Kram schreiben soll. Bei Strings ist das egal, weil die implizit schon eine Speicheradresse sind, ints musst du referenzieren:

C++:
fscanf(datei, "%s,%d\n", name1, &punkte1);
fscanf(datei, "%s,%d\n", name2, &punkte2);
fscanf(datei, "%s,%d\n", name3, &punkte3);


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.12.2003, 01:46 Uhr
lubU



hab beides schon probiert.
weiss schon dass ich bei %f %d usw & brauch.
funktioniert aber beides nicht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.12.2003, 01:52 Uhr
0xdeadbeef
Gott
(Operator)


Ach ja, mein Fehler. Die einfachste Lösung wäre, das Komma durch ein Leerzeichen zu ersetzen. Mit Komma gehts auch, aber da weiß ich grad nur in C++ ne einfache Lösung. Wenn du statt des Kommas ein Leerzeichen nimmt, hilft dir der Code:

C++:
fscanf("%s %d", name1, &punkte1);


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.12.2003, 01:54 Uhr
lubU



mal im Original
inhalt der high.sco :

user1,700
user2,500
user3,300




C++:

char name1[20], name2[20], name3[20];
int punkte1, punkte2, punkte3;
FILE *hiscore;
hiscore = fopen("high.sco","r");
        
fscanf(hiscore, "%s,%d\n", name1, &punkte1);
fscanf(hiscore, "%s,%d\n", name2, &punkte2);
fscanf(hiscore, "%s,%d\n", name3, &punkte3);

    fclose(hiscore);

printf("\nName1: %s Punkte1: %d", name1, &punkte1);
printf("\nName2: %s Punkte2: %d", name2, &punkte2);
printf("\nName3: %s Punkte3: %d", name3, &punkte3);
printf("\n");




ausgegeben bekomm ich:
Name1: user1,700 Punkte1: -566
Name2: user2,500 Punkte2: -568
Name3: user3,300 Punkte3: -570

??????
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.12.2003, 01:56 Uhr
lubU



mit leerzeichen gehts auch nicht. hatte ich auch schon versucht....
// edit:
bei nem leerzeichen rafft er den string. aber er gibt die selben negativen Zahlen aus.

Dieser Post wurde am 18.12.2003 um 01:57 Uhr von lubU editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.12.2003, 01:59 Uhr
0xdeadbeef
Gott
(Operator)


Das ist auch kein Wunder. fscanf(hiscore, "%s", name1); liest aus der Datei hiscore einen String in name1 ein, und zwar alle Zeichen bis zu einem gültigen Trennzeichen. Sonst wäre das ganze nicht mehr in linearer Zeit realisierbar und ziemlich kompliziert. Gültige Trennzeichen sind Whitespaces - space, tab und newline. Das heißt, er hört erst am Ende der Zeile auf, zu lesen und versucht dann eine Zahl einzulesen, was in aller Regel nicht hinhauen wird.

In C++ wärs simpel:

C++:
std::ifstream hiscore("hiscore.txt");
std::string name1;
int punkte1;

std::getline(hiscore, name1, ',');
hiscore >> punkte1;


Aber in C - naja, entweder, du spielst an der locale rum, oder du machst es gleich von Hand. Oder du nimmst ein Leerzeichen anstatt eines Kommas als Trennzeichen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 18.12.2003 um 02:00 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
18.12.2003, 02:05 Uhr
lubU



beim leerzeichen gibt er mir aus:
name1: user1 punkte1: -568
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
18.12.2003, 02:07 Uhr
0xdeadbeef
Gott
(Operator)


Du musst dann natürlich auch das Komma aus dem Format-String durch ein Leerzeichen ersetzen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
18.12.2003, 02:11 Uhr
0xdeadbeef
Gott
(Operator)


Noch eine Sache - sollen die Namen der Highscore-Tabelle Leerzeichen enthalten dürfen? Dann müsstest du das nochmal anders machen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: