Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » fscanf problem dringend hilfe

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
27.12.2006, 17:15 Uhr
hans-mecha



Hallo

ich will mit fscanf daten aus irgendeiner datei lesen.
wenn ich float zahlen finde sollen diese in einem array abgelet werden.
nun mein problem wie kann ich überprüfen ob nur float werte gelesen wurden die dann in einem array abgelegt werden sollen.
wenn ein zeichen in der datei steht schreibt er mir dafür immer eine negative zahl rein für alle feldelemente im array
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.12.2006, 17:23 Uhr
ao

(Operator)


1. Muss es die alte C-Methodik sein, also fscanf & Co? In C++ gibts bessere Methoden.

2. fscanf funktioniert dann gut, wenn du das Format der ankommenden Daten kennst, d.h. weißt, wann eine Zahl kommt und wann etwas anderes. Wenn du den Zeichenstrom erst untersuchen musst, um herauszufinden, *ob* es Zahlen sind, musst du anders ansetzen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.12.2006, 17:47 Uhr
0xdeadbeef
Gott
(Operator)



C++:
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <vector>

int main() {
  std::ifstream in("datei.txt");
  std::vector<double> vec;

  std::copy(std::istream_iterator<double>(in),
            std::istream_iterator<double>(),
            std::back_inserter(vec));
}


Liest Dateien mit Fließkommazahlen, getrennt durch whitespaces, in vec ein.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
27.12.2006, 18:02 Uhr
~hans-mecha
Gast


Also es muß ansi c standard sein.
und ich will natürlich dateien lesen die nur zahlen entzhalten.
wenn aber nun eine datei statt zahlen zeichen enthält will ich das das hauptprogramm eine meldung ausgeben kann das die datei nicht eben falsch war weil sie zeichen enthalten hat
hier mal die funktion die daten aus einer datei liest und in ein array packen soll


C++:
int nextDataSet(int n, int *pNuOfElement, float *pIncome)
{
    int i=0;
    char  filename[255];
    float c;
    FILE *fp;
    *pNuOfElement = 0;

    printf("Bitte geben Sie den Dateinamen an:");
    scanf("%s",filename);
    fp = fopen(filename ,"r");
    
    if(fp != NULL) {
        while((fscanf(fp, "%f", &c)) != EOF && i < n) {
            if ((???????????)) {
                *(pIncome + i) = c;
                i++;
            }
            else {
                printf("\n!!!Datei enthaelt falsche Werte!!!");
                return 1;
            }
        }
        *pNuOfElement = i;
        fclose(fp);
        return 0;
    }
    else {
        printf("!!!keine gueltige Datei!!!""");
        return 1;    
    }
}



an die stelle ??? dachte ich ich kann eine bedingung einfügen die mir sagt ob zahl oder nicht

income ist das array aus hauptprogramm
n ist die max anzahl der elemente und nuOfElement ist die nacher tatsächlich gelesenen zahlen

hier arbeite ich halt nur mit zeiger wie man am *p sehen kann

mod edit: BENUTZE DIE CPP TAGS SELBER

Dieser Post wurde am 27.12.2006 um 22:27 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
27.12.2006, 18:44 Uhr
ao

(Operator)


OK, dann solltest du den Rückgabewert von fscanf auswerten, der hilft dir weiter. Der ist nämlich mitnichten EOF, siehe z.B. hier:

www.cplusplus.com/ref/cstdio/fscanf.html

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
27.12.2006, 19:30 Uhr
~hans-mecha
Gast


Ok danke schon mal leider kann ich damit immer noch nicht viel anfangen bzw kann ich das nicht sinnvoll umsetzen könnte mir jemande sagen wie ich diese umsetze danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
27.12.2006, 19:40 Uhr
ao

(Operator)


Na ja, in deinem Beispiel oben retourniert der fscanf-Aufruf entweder 1 (wenn eine Fließkommazahl korrekt gelesen wurde) oder 0 (wenn etwas anderes kam, was nicht als Fließkommazahl interpretierbar war) oder EOF (wenn die Datei am Ende war).

Kann also doch EOF kommen, sorry, ich hatte die Referenz nicht bis zum Ende gelesen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
28.12.2006, 15:20 Uhr
0xdeadbeef
Gott
(Operator)


Richtiger wäre allerdings

C++:
        while(i < n && fscanf(fp, "%f", &c) == 1) {


...denn wir wollen ja keine Zahl verlieren, wenn wir keinen Platz mehr haben.

Denkbar wäre auch

C++:
int read_next_data_set(FILE *fd, double *dest, size_t n, size_t *read_elements) {
  double d;
  int i, status = 0;

  for(i = 0; i < n; ++i) {
    int scan_status = fscanf(fd, "%lf", &d));

    if(scan_status == 1) {
      dest[i] = d;
    } else if(scan_status == 0) {
      fputs(stderr, "Fehler beim Einlesen der Datei.");
      status = 1;
      break;
    } else { // scan_status == EOF
      status = 2;
      break;
    }
  }

  *read_elements = i;

  return status;
}


...ist jetzt ungetestet, sollte aber hinhauen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 28.12.2006 um 15:29 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
29.12.2006, 11:30 Uhr
~hans-mecha
Gast


alles klar super danke
 
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: