c Datei einlesen und Daten verarbeiten

#1
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:
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

Erfahrenes Mitglied
#2
C++:
#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;
}
 
#3
C++:
#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;
}
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
C++:
#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;
}
 
#5
C++:
  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
 
#6
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
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 ! !

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 :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
ok, vielleicht ist die While-Schleife so besser und verständlicher:

Java:
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
 
#9
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
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
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!

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
 
#12
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:
#13
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
 
#15
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
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:
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);
 
#17
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! ;-]

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

gruß
Klaus
 
#18
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
Codetags fehlen immer noch !!

also ....

float minalt=100,minneu=0, WERT,temp;
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
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: