vscanf, vfscanf und vsscanf - Beispiele
-
Die scanf-Funktionen sind Teufelszeugs und sollten nie
verwendet werden. Das Zeugs ist einfach viel zu unsicher und
gerade bei der Verwendung von Dateien als Eingabe sogar
fahrlässig.
-
Hast du eine bessere Methode, unter ANSI C Daten einzulesen? Dann immer her damit
-
die gibt es auch z.b. vscanf
-
maximo, und warum soll die sicherer sein?
-
maximo schrieb:
die gibt es auch z.b. vscanf
Tolle Idee - weil die scanf Familie zu unsicher ist, nehmen wir halt vscanf
-
sorry, ich les nur vom buch ab
vscanf ist von C99 und dachte es ist sicherer?
-
halbwissen ist gefaehrlich.
glaube umsomehr.
-
CStoll schrieb:
Hast du eine bessere Methode, unter ANSI C Daten einzulesen? Dann immer her damit
Ja, z. B. strtok.
Buffer aufmachen, file einlesen udn mit strtok die einzelnen
tokens auslesen. Ist viel schneller und tausendmal zuverlässiger.
-
maximo schrieb:
sorry, ich les nur vom buch ab
vscanf ist von C99 und dachte es ist sicherer?Also hier ein aus dem Kopf geschriebens Beispiel:
/* Datei öffnen */
FILE *p_file = fopen ("C:\\Datei", "rb");
if (p_file == NULL)
{
return FALSE;
}// Dateigröße bestimmen.
struct _stat state;
_fstat (fileno(p_file), state);
size_t len = state.st_size;// Speicher entsprechender Größe allokieren
char *p_buffer = malloc (len+1);
if (p_buffer == NULL)
{
fclose (p_file);
return -1;
}// Datei lesen
if (fread (p_buffer, 1, len, p_file)
{
fclose (p_file);
free (p_file);
return -2;
}fclose (p_file);
char *p = p_buffer;
// Zum Beispiel csv parsen
while ((p = strtok (p, ",\n")) != NULL)
{
/* Hier jetzt den gelesenen Wert verarbeiten.
in p steht genau der Wertz der durch z. B.
, oder \n getrennt wurde.
*/
}
free (p_buffer);
}
-
Sicher könnte diese Variante sicherer sein, aber ob sie wirklich einfacher anzuwenden ist als die scanf-Funktionen wage ich zu bezweifeln:
- _fstate() ist afaik keine Standard-Funktion
- Einlesen von Tastatur wirst du damit auch nicht hinbekommen (oder schaffst du es, alle vom User kommenden Eingaben bei Programmbeginn zu bekommen?)
- korrekt parsen mußt du deine Daten an dieser Stelle auch noch
PS: und "free(p_file);" ist nonsens