Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » problem mit fscanf und fprintf

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 <
000
08.12.2010, 14:36 Uhr
bilgen



Hallo,
ich mache die ersten Gehversuche in c und stolpere ständig.
Folgendes problem:
Ich muss Textdateien öffnen und die Zahlen darin bearbeiten.
Die Zahlen haben folgendes Format:
1.123456789e+15 (Im Exponent steht höchsten +/-15 )
1.1234567e-15
123456789012345 (15-Stellen)
Ich definiere eine double variable und ein double array:

double *m,dummy;

m1=(double*)malloc(100*sizeof(double));

Wenn ich eine 10-stelligeZahl z.B. 12345678901234 manuell eingebe:
scanf("%lf",&m1[0]);
printf("m1[0] = %lf",m1[i0]);
dann bleibt das Programm hängen.

Wenn ich jedoch eine casting vornehme, dann klappt es:
scanf("%lf",&dummy);
m1[i0]=(double)dummy);
printf("m1[0] = %lf",m1[i0]); => 12345678901234 Das klappt.
Warum musst ich diesen Zwischenschritt einlegen?

Zweites Problem:

Zahlen von der Gestalt 2e+15 erscheinen richtig mit zusätzlichen vier Stellen nach den Komma.Also:
2000000000000000.0000
Bei negativen Exponenten erscheinen jedoch nur sechs Stellen nach dem Komma, egal was im Exponent steht:
2e-3 erscheint als 0.002000
Was muss ich machen, damit auch Zahlen mit mehr als 6 Stellen nach dem Komma richtig dargestellt werden können.Etwa:
2e-15 als 0.000000000000002

Mein Compiler ist eine alte Version von Visual c++.

Bitte keine komplizierte Vorschläge, wenn es einfacher geht. Wie gesagt, bin ich ein Laie mit sehr wenig Erfahrung.

Vielen Dank für die Antworten im Voraus
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.12.2010, 15:16 Uhr
Tommix



Hallo,
bei dem ersten Problem kann ich , außer daß Du einmal m und dann m1 schreibst, nichts verdächtiges bemerken (die alte "bei mir läufts" Nummer):

C++:
int main()
{
    double *m1,dummy;

    m1=(double*)malloc(100*sizeof(double));
    scanf("%lf",&m1[0]);
    printf("m1[0] = %f\n",m1[0]);

    return 0;
}


Das zweite ist nur eine Frage der Formatierung:

C++:
printf("%.15f\n", 2E-15);


Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.12.2010, 16:50 Uhr
~bilgen
Gast


Hallo Tommix,
vielen Dank für Deine Antwort.
Leider kam ich nicht viel weiter.
Was Du geschrieben hast geht auf:
printf("%.15f\n", 2E-15); Ausgabe:0.000000000000002 Korrekt!

Allerding, wenn ich diesen Wert erst einer Variablen zuweise und dann ausgeben will, erhalte ich einen falschen Wert, egal, ob es sich um eine double-Variable handelt, oder float.

scanf("%.15f\n",&a);
printf("%.15f",a);-> falscher Wert.

scanf("%.lf\n",&a);
printf("%.15f",a);-> falscher Wert.

Ich habs mit meinem alten Compiler und mit Visual c++ Expressedition 2008 versucht.Beide lieferten verschiedene, aber falsche Werte.
Auch Werte ohne Exponent wurde falsch ausgegeben.

Das mit "m" und "m1" war lediglich ein Schreibfehler hier im Forum.

Ich würde mich freuen, wennDu mir sagen könntest, was ich falsch mache.
Vielen Dank für Deine Mühe.
Gruß
bilgen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.12.2010, 17:49 Uhr
Tommix



Bei scanf ist das l vor dem f wichtig, bei printf nicht (hier wird float immer zu double). Die Formatangabe ist für die Ausgabe relevant. Also:

C++:
float f;
scanf("%f\n", &f);
printf("%.3f\n", f);

double d;
scanf("%lf\n", &d);
printf(%.3f\n", d);


Außerdem könntest Du noch schauen, ob scanf geklappt hat. Der Rückgabewert ist die Anzahl der gelesenen Werte:

C++:
if (scanf("%f", &f) == 1)
    printf("%.3f\n", f);
else
    printf("Fehler\n");



Hab schnell mal dies ergoogelt: http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/format.html
Da steht zu scanf bestimmt auch was.

Gruß,
Tommix

Dieser Post wurde am 08.12.2010 um 17:50 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.12.2010, 19:27 Uhr
bilgen



Hallo Tommix,
endlich hat es geklappt!
Ein tolles Gefühl!
Vieeeeelen Dank!
Gruß
bilgen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: