# c Datei einlesen und Daten verarbeiten



## newbie89 (18. August 2009)

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

```
FILE*fp;
 int daten[100];
 int i;
 float min;

fp= fopen ("C:\\ProgramFiles\\cpp\\Katalog1.txt","a+");
   if (fp==NULL)
               printf("Fehler beim Oeffnen.\n");
       else
               printf("Datei erfolgreich eingelesen.\n");
                     
               
                                                               /* while (fgets(daten, sizeof(daten),fp) !=0)
                                                             fputs (daten,stdout);
                                                           min='C'-'daten[]';
                                                            printf("%f",min);*/
         
   for (i=0;i<=(sizeof(daten));i++)
   {
       fscanf("%i", &daten[i]) ;                       
                             
   }
```
 
oder wie gehe ich da am besten vor ...


----------



## devDevil (18. August 2009)

```
#include <stdio.h>

int main() 
{
  FILE* ptr_file = fopen("fscanf.txt", "r");

  if (!ptr_file) 
  {
    printf("Error: can't open file.\n");
    return 1;
  }
  printf("File opened successfully.\n");

  int temp = -1;
  while (!feof(ptr_file) && temp != 20) /* hier 20 anpassen ... */
      fscanf(ptr_file, "%d", &temp);
  printf(temp == 20 ? "Number found!" : "Number not found!");

  fclose(ptr_file);
  return 0;
}
```


----------



## newbie89 (19. August 2009)

devDevil hat gesagt.:


> ```
> #include <stdio.h>
> 
> int main()
> ...



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


----------



## Jacal (19. August 2009)

```
#include <stdio.h>
 
int main()
{
  // Datei "fscanf.txt" öffnen, "r" heißt nur lesen.
  FILE* ptr_file = fopen("fscanf.txt", "r");
 
  if (!ptr_file)
  {
    // Die Datei existiert nicht - abbrechen!
    printf("Error: can't open file.\n");
    return 1;
  }
  printf("File opened successfully.\n");
 
  // Temporäre Integer-Variable, die zum Einlesen der Zahlen verwendet wird.
  int temp = -1;
  // Solange temp ungleich 20 (oder einer anderen variablen Zahl) ist, suchen wir
  // weiter, undzwar solange, bis das Dateiende erreicht ist (!feof(ptr_file)).
  while (!feof(ptr_file) && temp != 20) /* hier 20 anpassen ... */
      // Eine Zahl aus der Datei einlesen, wird in temp gespeichert
      fscanf(ptr_file, "%d", &temp);

  // Wenn temp gleich 20 (oder einer anderen variablen Zahl) ist, wurde die gesuchte
  // Zahl gefunden, andernfalls nicht.
  printf(temp == 20 ? "Number found!" : "Number not found!");
 
  // Datei schließen
  fclose(ptr_file);

  return 0;
}
```


----------



## Matthias Reitinger (19. August 2009)

devDevil hat gesagt.:


> ```
> int temp = -1;
> while (!feof(ptr_file) && temp != 20) /* hier 20 anpassen ... */
> fscanf(ptr_file, "%d", &temp);
> ```


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


----------



## newbie89 (19. August 2009)

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...


----------



## vfl_freak (19. August 2009)

newbie89 hat gesagt.:


> 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.


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



newbie89 hat gesagt.:


> 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...


Was genau verstehst Du daran nicht 
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


----------



## vfl_freak (19. August 2009)

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


```
int iValue = 20;  // der gesuchte Wert

while( !feof(ptr_file) )
{
    // Eine Zahl aus der Datei einlesen, wird in temp gespeichert
    fscanf(ptr_file, "%d", &temp);
 
    // Wenn temp gleich der gesuchten Zahl ist
    if( temp == iValue )
    {
        printf( "Number found !" );
        break;  // Schleifenabbruch
    }
    else
    {
        printf( "Number not found !" ); // Weitersuchen!!
    }
} // while
```

Gruß
Klaus


----------



## newbie89 (19. August 2009)

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)


----------



## newbie89 (19. August 2009)

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


----------



## vfl_freak (19. August 2009)

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!



newbie89 hat gesagt.:


> 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



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 (19. August 2009)

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);

}


----------



## vfl_freak (19. August 2009)

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 ? ? ? 
Zweite Frage: warum GLOBALE Variablen ? ? ? 

Gruß
Klaus


----------



## vfl_freak (19. August 2009)

newbie89 hat gesagt.:


> ...
> *if (minneu<minalt)
> WERT=temp;
> minalt=minneu;
> *...



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

Gruß
Klaus


----------



## newbie89 (19. August 2009)

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


----------



## newbie89 (19. August 2009)

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


```
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);
            printf("minneu: %f\n",minneu);
            
            if (minneu<minalt)  
               {  
                  WERT=temp;
                  minalt=minneu;
               }   
       }
       
       
               
            printf("WERT: %f\n",WERT);
```


----------



## vfl_freak (19. August 2009)

newbie89 hat gesagt.:


> 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.



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! ;-]



newbie89 hat gesagt.:


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


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' ! ! ! 

gruß
Klaus


----------



## newbie89 (19. August 2009)

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?


----------



## vfl_freak (19. August 2009)

Codetags fehlen immer noch !!

also ....



> float minalt=100,minneu=0, WERT,temp;


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

Gruß
Klaus


----------



## newbie89 (19. August 2009)

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....


----------



## Matthias Reitinger (19. August 2009)

newbie89 hat gesagt.:


> ```
> fscanf(fp, "%d", &temp);
> ```


Das kann doch nur schief gehen, wenn du einen Ganzzahlwert in eine Fließkommavariable schreibst. Probier es mal so:

```
float targetValue = 20.0f;

FILE* fp = fopen("C:\\ProgramFiles\\cpp\\Katalog1.txt", "r");
if (fp == NULL)
{
  printf("Fehler beim Oeffnen.\n");
  return 1;
}
printf("Datei erfolgreich geoeffnet.\n");

float minDelta = 100.0f, nearestValue = 0.0f, value;
while (fscanf(fp, "%f", &value) > 0)
{
  float delta = fabs(targetValue - value);
  if (delta < minDelta)
  {
    minDelta = delta;
    nearestValue = value;
  }
}
fclose(fp);

printf("WERT: %f\n", nearestValue);
```
Grüße, Matthias


----------

