1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

c Datei einlesen und Daten verarbeiten

Dieses Thema im Forum "C/C++" wurde erstellt von newbie89, 18. August 2009.

  1. newbie89

    newbie89 Mitglied

    Hi,

    ich möchte eine datei einlesen die so aus sieht:

    5
    10
    15
    20
    25
    30
    .... das bis 100

    und zwar möchte ich die zeile für zeile einlesen und dann pro zeile die eingelesene zahl mit einer variable vergleichen.
    nehm ich da am besten eine for schleife z.b. so
    Code (Text):
    1. FILE*fp;
    2.  int daten[100];
    3.  int i;
    4.  float min;
    5.  
    6. fp= fopen ("C:\\ProgramFiles\\cpp\\Katalog1.txt","a+");
    7.    if (fp==NULL)
    8.                printf("Fehler beim Oeffnen.\n");
    9.        else
    10.                printf("Datei erfolgreich eingelesen.\n");
    11.                      
    12.                
    13.                                                                /* while (fgets(daten, sizeof(daten),fp) !=0)
    14.                                                              fputs (daten,stdout);
    15.                                                            min='C'-'daten[]';
    16.                                                             printf("%f",min);*/
    17.          
    18.    for (i=0;i<=(sizeof(daten));i++)
    19.    {
    20.        fscanf("%i", &daten[i]) ;                      
    21.                              
    22.    }
    oder wie gehe ich da am besten vor ...
     
  2. devDevil

    devDevil Erfahrenes Mitglied

    Code (C++):
    1. #include <stdio.h>
    2.  
    3. int main()
    4. {
    5.   FILE* ptr_file = fopen("fscanf.txt", "r");
    6.  
    7.   if (!ptr_file)
    8.   {
    9.     printf("Error: can't open file.\n");
    10.     return 1;
    11.   }
    12.   printf("File opened successfully.\n");
    13.  
    14.   int temp = -1;
    15.   while (!feof(ptr_file) && temp != 20) /* hier 20 anpassen ... */
    16.       fscanf(ptr_file, "%d", &temp);
    17.   printf(temp == 20 ? "Number found!" : "Number not found!");
    18.  
    19.   fclose(ptr_file);
    20.   return 0;
    21. }
     
    newbie89 gefällt das.
  3. newbie89

    newbie89 Mitglied

    Problem das ich eigentlich hauptsächlich hatte war das ich nicht zeilenwert um zeilenwert mit der variable vergleichen kann... kann man vielleicht noch ein paar erklärende sätze dazuschreiben. Danke
     
  4. Jacal

    Jacal Mitglied

    Code (C++):
    1. #include <stdio.h>
    2.  
    3. int main()
    4. {
    5.   // Datei "fscanf.txt" öffnen, "r" heißt nur lesen.
    6.   FILE* ptr_file = fopen("fscanf.txt", "r");
    7.  
    8.   if (!ptr_file)
    9.   {
    10.     // Die Datei existiert nicht - abbrechen!
    11.     printf("Error: can't open file.\n");
    12.     return 1;
    13.   }
    14.   printf("File opened successfully.\n");
    15.  
    16.   // Temporäre Integer-Variable, die zum Einlesen der Zahlen verwendet wird.
    17.   int temp = -1;
    18.   // Solange temp ungleich 20 (oder einer anderen variablen Zahl) ist, suchen wir
    19.   // weiter, undzwar solange, bis das Dateiende erreicht ist (!feof(ptr_file)).
    20.   while (!feof(ptr_file) && temp != 20) /* hier 20 anpassen ... */
    21.       // Eine Zahl aus der Datei einlesen, wird in temp gespeichert
    22.       fscanf(ptr_file, "%d", &temp);
    23.  
    24.   // Wenn temp gleich 20 (oder einer anderen variablen Zahl) ist, wurde die gesuchte
    25.   // Zahl gefunden, andernfalls nicht.
    26.   printf(temp == 20 ? "Number found!" : "Number not found!");
    27.  
    28.   // Datei schließen
    29.   fclose(ptr_file);
    30.  
    31.   return 0;
    32. }
     
  5. Matthias Reitinger

    Matthias Reitinger ɐɯıǝɹ

    Das ergibt allerdings eine Endlosschleife, wenn in der Datei nicht als Ganzzahl interpretierbare Zeichen auftauchen. Man sollte hier besser den Rückgabewert von fscanf als Abbruchbedingung verwenden.

    Grüße, Matthias
     
  6. newbie89

    newbie89 Mitglied

    kann ich anstatt einer fixen zahl wie etwa die 20 hier nicht irgendwas anderes benutzen denn wenn sich die liste nun verändert aber der code gleich bleibt hab ich ein problem.

    und wie sieht das jetzt mit dem vergleich aus ich kapier nicht ganz wie ich zeile um zeile mit meinem zu vor errechneten wert vergleichen kann das versteh ich einfach hier noch nicht...
     
  7. vfl_freak

    vfl_freak Premium-User

    Nimm einfach statt der '20' die Variable mit dem von Dir berechneten Wert ! !

    Was genau verstehst Du daran nicht :confused:
    Es werden zeilenweise die Werte aus der Datei nach 'temp' eingelesen und dann jeweils mit dem gewünschten Vergleichswert (hier fix '20' oder eben die Variable) verglichen .....

    Gruß
    Klaus
     
  8. vfl_freak

    vfl_freak Premium-User

    ok, vielleicht ist die While-Schleife so besser und verständlicher:

    Code (Java):
    1. int iValue = 20;  // der gesuchte Wert
    2.  
    3. while( !feof(ptr_file) )
    4. {
    5.     // Eine Zahl aus der Datei einlesen, wird in temp gespeichert
    6.     fscanf(ptr_file, "%d", &temp);
    7.  
    8.     // Wenn temp gleich der gesuchten Zahl ist
    9.     if( temp == iValue )
    10.     {
    11.         printf( "Number found !" );
    12.         break;  // Schleifenabbruch
    13.     }
    14.     else
    15.     {
    16.         printf( "Number not found !" ); // Weitersuchen!!
    17.     }
    18. } // while
    Gruß
    Klaus
     
    newbie89 gefällt das.
  9. newbie89

    newbie89 Mitglied

    mh ok werd ich gleich mal probieren...

    wie siehts mit der variante aus kann man das hierdraus auch noch weiterbauen

    while (fgets(daten, sizeof(daten),fp) !=0)
     
  10. newbie89

    newbie89 Mitglied

    mhh das ist nicht das was ich suche ich möchte zeile für zeile mit meiner variable vergleichen und dann in jeder schleife praktisch den abstand zwischen dateiwert und variable ermitteln und wenn die datei ferrtig durchsucht ist will ich haben das der wert mit der geringsten differenz aus meiner datei ausgegeben wird.... eine zahl aus einer datei suchen ist was anderes oder steh ich jetzt völlig aufm schlauch
     
  11. vfl_freak

    vfl_freak Premium-User

    zuerst einmal: halte Dich bitte an die Netiquette:
    http://www.tutorials.de/index.php?pg=netiquette

    Besonders auf lesbare Texte Dank Groß- und Kleinschreibung etc. wird hier sehr viel Wert gelegt!

    Hmm, das ist ja nun eine völlig andere Aufgabenstellung :(

    So auf die Schnelle:
    (a) dann brich halt die Schleife NICHT ab .....
    (b) mach KEINEN Vergleich zw. 'temp' und Variable auf Gleichheit, sondern prüfe die Differenz!
    (c) merke Dir bei jedem Schleifenduchlauf zum einen die Differenz (wenn sie kleiner als die bisherige ist) und dann ggf. den dazugehörigen Wert!

    Es sollte eigentlich kein Problem, die zuvor gepostete Schleife dahingehend anzupassen .....

    Gruß
    Klaus
     
    newbie89 gefällt das.
  12. newbie89

    newbie89 Mitglied

    Hi, vielleicht kann hier mal einer drüberschauen wo liegt der Fehler?
    C ist eine Variable die global definiert ist. Mein Vergleichswert bzw. Variable


    void auswahl1 (void)
    {

    FILE*fp;
    float minalt=100,minneu=0, WERT,temp;

    fp= fopen ("C:\\ProgramFiles\\cpp\\Katalog1.txt","a+");
    if (fp==NULL)
    printf("Fehler beim Oeffnen.\n");
    else
    printf("Datei erfolgreich eingelesen.\n");


    while (!feof(fp))
    {
    fscanf(fp, "%d", &temp);
    minneu=(C- temp);

    if (minneu<minalt)
    WERT=temp;
    minalt=minneu;

    }


    fclose (fp);

    }
     
    Zuletzt bearbeitet: 19. August 2009
  13. vfl_freak

    vfl_freak Premium-User

    Nutze bitte auch die Code-Tags ! ! !
    Entweder den '#'-Button im Editor oder durch Einklammerung von [*CODE][*/CODE] (ohne die Sternchen) ! !

    Erste Frage: was für ein Fehler ? ? ? :confused:
    Zweite Frage: warum GLOBALE Variablen ? ? ? :confused:

    Gruß
    Klaus
     
  14. vfl_freak

    vfl_freak Premium-User

    Dein Fehler liegt genau hier - schau Dir mal Deine if-Anweisung genau an ! ! ! :p

    Gruß
    Klaus
     
  15. newbie89

    newbie89 Mitglied

    Also ich habe ein main in diesem main wird die funktion aus dem letzten beitragaufgerufen.
    Von einer anderen Funktion wird meine Vergleichsvariable C errechnet, dass ich sie nun in meiner anderen Funktion verwenden kann muss ich sie doch global machen.

    Fehler ist dass ich für meinen WERT immer 0.00000 erhalte.

    Danke
     
  16. newbie89

    newbie89 Mitglied

    Hi,
    hoffe der Code ist nach den Vorschriften und gut lesbar problem ist denke ich das er aus der datei nicht den nächsten WERT holt und neu vergleicht denn es kommt an der stelle
    printf("minneu: %f\n",minneu);
    immer das gleiche ergebnis raus. Danke

    Code (Text):
    1. FILE*fp;
    2.  
    3. float minalt=100,minneu=0, WERT,temp;
    4.  
    5. fp= fopen ("C:\\ProgramFiles\\cpp\\Katalog1.txt","a+");
    6.    if (fp==NULL)
    7.                printf("Fehler beim Oeffnen.\n");
    8.        else
    9.                printf("Datei erfolgreich eingelesen.\n");
    10.                
    11.        
    12.  while (!feof(fp))      
    13.        {
    14.             fscanf(fp, "%d", &temp);
    15.               minneu=(C-temp);
    16.             printf("minneu: %f\n",minneu);
    17.            
    18.             if (minneu<minalt)  
    19.                {  
    20.                   WERT=temp;
    21.                   minalt=minneu;
    22.                }  
    23.        }
    24.        
    25.        
    26.                
    27.             printf("WERT: %f\n",WERT);
     
  17. vfl_freak

    vfl_freak Premium-User

    Du könntest/solltest sie auch als Parameter die Funktion übergeben! Globale Variablen sind immer unschön und gefährlich - vor allem, wenn sie nur C heißen und keinen sprechenden Bezeichner haben! ;-]

    Na, logisch ! ! Vgl. meinen letzten Post ! !
    Du merkst Dir zwar den WERT nur, wenn die Differenz kleiner ist, setzt die neue Differenz aber jedes Mal auf Dein 'minalt' ! ! ! :eek:

    gruß
    Klaus
     
  18. newbie89

    newbie89 Mitglied

    Hab halt im bezug auf dateien verarbeiten mal sowas von gar keinen plan das ist schon sch***

    Glaube unsere Posts überschneiden sich manchmal hab klammern gesetz müsst doch so jetzt passen hast den post von gerade 12:23 schon gesehen?
     
    Zuletzt bearbeitet: 19. August 2009
  19. vfl_freak

    vfl_freak Premium-User

    Codetags fehlen immer noch !!

    also ....

    Sind es denn wirklich Fließkommazahlen ? ? ?
    Warum nicht Integer :confused:
    Zudem sind WERT und TEMP NICHT initialisiert .....
    Was für ein Datentyp ist denn nun Dein 'C' :confused:

    Gruß
    Klaus
     
  20. newbie89

    newbie89 Mitglied

    C ist von datentyp float, deshalb muss der rest auch float sein...

    temp ist auch immer 0.0000 ich denke er durchläuft immernoch nicht die datei...
    das ist mein problem den rest muss im anschluss verfeinern....
     
    Zuletzt bearbeitet: 19. August 2009
Die Seite wird geladen...