Probleme bei Importieren von Datensätzen
-
Hallo zusammen, habe folgendes problem:
ich möchte bestimmte Daten in eine Datei exportieren, nach folgenden String format:
const char * const stream = "%u|%3hhu - %hhu|%3hhu -%7.2f|%6.0f - %hhu|%hhu || ";
Exportiert wird mit folgender Funktion
if (fprintf(fp, stream, pthis->start_einheit, pthis->start_time, pthis->end_einheit, pthis->end_time, pthis->zeitstrahl, pthis->nachrichtendauer, pthis->status, pthis->laenge) > 0) {
Das Exportieren funktioniert ohne probleme, wenn ich die txt datei öffne, sehe ich die Datensätze alle mit richtigen werten.
Jeddoch wenn ich Importiere mit :
if (fscanf(fp, stream, &pthis->start_einheit, &pthis->start_time, &pthis->end_einheit, &pthis->end_time, &pthis->zeitstrahl, &pthis->nachrichtendauer, &pthis->status, &pthis->laenge) > 0) {
Dann funktioniert das einlesen nciht mehr richtig. ich habe festgestellt das wenn ich die variablen nachrichtendauer (%7.2f) und zeitstrahl (%6.0f) weglasse geht das importieren ohne probleme.
Hier noch die Datentypen:
unsigned char start_time; unsigned char start_einheit; unsigned char end_time; unsigned char end_einheit; unsigned char status; unsigned char laenge; double time; double zeitstrahl; double nachrichtendauer; struct Protokollframe frame1;
-
scanf() und printf() sind auch zwei völlig verschiedenen Funktionen.
Die Formatspecifier sehen zwar auf den ersten Blick gleich aus, sind sie aber nicht.%f steht bei printf() für double und float.
den Parameter .precision gibt es bei scanf() nicht.
-
was kann ich alternativ machen?
-
Auch wenn die Formatstrings für Xprintf und Xscanf ähnlich aussehen, so haben sie doch nicht die gleiche Syntax. Den Unterschied bei float und double sollte wohl jeder kennen, da dies wohl der häufigste Fehler ist. Aber ich verlink trotzdem mal komplett anstatt dir einfach die Lösung zu geben, damit du selber die ganzen Unterschiede siehst:
http://www.cplusplus.com/reference/clibrary/cstdio/fprintf/
http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/edit: Zu spät.
matrix1900 schrieb:
was kann ich alternativ machen?
Es richtig machen? Was hindert dich, zwei unterschiedliche Formatstrings zu benutzen?
-
Zwei verschiedene Strings.
-
Struktur für die Daten anlegen und mit fwrite und fread im binary mode
schreiben und lesen
-
mit 2 strings habe ich mir auch schon überlegt. aber wie definiere ich den 2.ten string für scanf anstatt die . (7.2) ?
Das Problem ist auch das die daten zeitstrahl und nachrichtendauer unterschiedliche stellenanzahlen haben . je nach datensatz
-
pferdefreund schrieb:
Struktur für die Daten anlegen und mit fwrite und fread im binary mode schreiben und lesen
Inkompatibler geht es kaum noch.
@SeppJ
Das war nicht zu spät sondern mit Nachdruck.
Dann ist das nicht das Gelaber von einem Idioten.@matrix1900
Lass alle Längenangaben beiscanf()
weg.
-
also ich habe jetzt folgenden string für scanf, jedoch ohne erfolg.
const char * const stream2 = "%u|%u - %u|%u -%f|%f - %u|%u || ";
beim ersten datensatz stimmen die werte noch bis zum letzen %f danach nur noch 0
bei den folgenden datensätzen kommt nur noch müll raus.
-
Die hh für char musst du schon drin lassen. Du solltest nur die Längenangaben (die Zahlen) weg lassen.
-
das hatte ich auch schon getestet also hiermit:
const char * const stream2 = "%hhu|%hhu - %hhu|%hhu -%f|%f - %hhu|%hhu || ";
geht es nicht weil die double werte nicht immer 7 bzw. 6 stellen haben? die unterscheiden siche jeweils von datensatz zu datensatz?
-
hh ist nur C99, d.h. dein Compiler muss dies unterstützen.
bei scanf für double gilt %lf und nicht %f, liest du eigentlich die gegebenen Hinweise?
Außerdem liefert scanf/sscanf einen Rückgabewert, den du auswerten solltest.
Daran kannst du erkennen, wo scanf abbrach.
-
danke für die infos hat mir geholfen
-
Wutz schrieb:
bei scanf für double gilt %lf und nicht %f, liest du eigentlich die gegebenen Hinweise?
Das bekomme ich beim MinGW 4.6.1 nicht hin. Alle anderen Testcompiler verarbeiten das. Hab ich das was übersehen? C99 ist aktiviert beim gcc. Bei den anderen Compiler geht das auch ohne explizit C99.
MfG f.-th.
-
%lf für double, %f für float bei scanf, steht so im Standard (C89).
Wenn du damit nicht klar kommst, ist das dein Verständnisproblem.
"Funktioniert bei mir", "Funktioniert auf meinem Compiler", "Funktioniert in meinem Betriebssystem" ist schlimmstes Laiengesülze und Pfuscher JW Niveau.
-
Extra für Wutz:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46908Die Aussagen: "kann gar nicht sein" steht ja in "C was auch immer" helfen einem da wenig weiter, wenn der Compiler ein Teil des Standards nicht versteht. Und das ist ja nicht ein Nischenprodukt oder?
Ausserdem heisst es bei J. Wolf, deinem Liebling: "Es ist ja noch mal gut gegangen"
-
f.-th. schrieb:
Extra für Wutz:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46908Die Aussagen: "kann gar nicht sein" steht ja in "C was auch immer" helfen einem da wenig weiter, wenn der Compiler ein Teil des Standards nicht versteht. Und das ist ja nicht ein Nischenprodukt oder?
Hast du den Bugreport mal bis zum Ende gelesen?
-
Wenn du lesen könntest, würdest du lesen, dass ich gesagt habe:
"standardgemäß ist ..."
Wenn du oder andere Leute mit ihren Compilern nicht klar kommen, ist das deine/ihre Sache.
Du implizierst, dass ich gesagt hätte, "... der gcc akzeptiert/akzeptiert nicht irgendetwas..." was schlichtweg falsch ist, was man wie gesagt, bei aufmerksamen Lesen nicht passieren würde.
-
matrix1900 schrieb:
geht es nicht weil die double werte nicht immer 7 bzw. 6 stellen haben? die unterscheiden siche jeweils von datensatz zu datensatz?
%f oder auch %lf lesen alles ein was zu eine Fließkommazahl passt. Da gibt es keinen Unterschied zu %g und %e.
Du kannst in deinem Formatstring (für scanf) auch die Leerzeichen weglassen, da diese überlesen werden.
-
f.-th. schrieb:
Ausserdem heisst es bei J. Wolf, deinem Liebling: "Es ist ja noch mal gut gegangen"
Du kennst scheinst dich bei o.g. Herrn ja gut auszukennen, evtl. bist du es gar selbst. Deine Codebeiträge bisher wären jedenfalls niveaumäßig passend.
-
DirkB schrieb:
Du kannst in deinem Formatstring (für scanf) auch die Leerzeichen weglassen, da diese überlesen werden.
Ich korrigier noch mal:
Führende Leerzeich können weggelassen werden.
Die Leerzeichen vor den '|' oder '-' (nach den Zahlen) müssen bleiben.