Gerade/ungerade Zahlen herauslesen



  • Ah ok.

    Also jetzt das ganze zusammen gefasst :D:

    In Text-Datei steht:
    2 3 2
    6 6 7

    fscanf(file1,"%d",%zahl) ---> liest 2 dann leerzeichen dann 3 usw. zeichenweise halt^^.

    fscanf(file1,"%d %d %d"&a,&b,&c) ---> es speichert einfach 2 in a 3 in b und 2 in c.

    In Text-Datei steht:
    255 565
    165 10

    Wenn mann hier jetzt also Zahlgruppen speichern will dann muss man Strings-Array verwenden? So ungefähr stimmts?

    char temp[100]

    fscanf(file1,"%s",&temp)---> jetzt liester es 2 dann 5 dann 5 dann ist ein leer ---> es speichert 255 in temp dann geht weiter liest 5 6 dann 5 sieht \n speichert wieder 565 in temp...

    fscanf(file1,"%s %s"&temp, &temp1) ---> jetzt dadurch das jetzt 2 %s hier sind, liest es wie oben nur speichert es halt 255 in temp und 565 in temp1.

    Dürfte eigentlich im Großen und Ganzem stimmen oder?



  • Billy schrieb:

    Ah ok.

    Also jetzt das ganze zusammen gefasst :D:

    In Text-Datei steht:
    2 3 2
    6 6 7

    fscanf(file1,"%d",%zahl) ---> liest 2 dann leerzeichen dann 3 usw. zeichenweise halt^^.

    fscanf(file1,"%d %d %d"&a,&b,&c) ---> es speichert einfach 2 in a 3 in b und 2 in c.

    In Text-Datei steht:
    255 565
    165 10

    Wenn mann hier jetzt also Zahlgruppen speichern will dann muss man Strings-Array verwenden? So ungefähr stimmts?

    Nein, die Datei kannst du auch als Zahlen verarbeiten. Bei %d liest er solange, bis das nächste Zeichen keine Ziffer ist, und fasst das Ergebnis dann zu einem Zahlenwert zusammen.
    Das ist die große Stärke von fscanf() - er läuft zwar intern zeichenweise durch die Datei, aber er kann die gelesenen Zeichen(folgen) auch sinnvoll interpretieren.

    Wenn du mehrere Format-Kennungen in dem String hast, macht er so lange weiter, bis er entweder am Dateiende angekommen ist oder den kompletten Formatstring ausgewertet hat (und schreibt die gelesenenen Werte der Reihe nach in die übergebenen Parameter).

    (Randfrage: Was verwendest du denn als Lernhilfe, abgesehen vom Forum?)



  • Danke.

    So...
    Nun hab ich das ganze mit den ungerade und geraden zahlen programmiert.
    Also es soll aus zahlen.txt alle ungeraden in ungerade.txt und alle geraden Zahlen in gerade.txt speichern.

    zahlen.txt enthält:
    15683256

    Nur kommen 2 Fehler die ich überhaupt nicht kenne(Anfänger 😉 ) und noch nie gehabt habe.

    1>C:\Dokumente und Einstellungen\....\Eigene Dateien\Visual Studio 2008\Projects\file003.c\Debug\file003.c.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise
    
    1>file003.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_foef" in Funktion "_zahlen".
    

    Es kommen auch Warnungen das fopen und fscanf möglicherweise unsafe sind.
    Ich glaub die sind aber nicht von großer Bedeutunng?

    Hier das Programm:

    #include <stdio.h>
    #include <stdlib.h>
    
    void zahlen(char filename[]);
    
    void zahlen(char filename[])
    {
      FILE*file1=NULL;
      FILE*file2=NULL;
      FILE*file3=NULL;
    
      int c=0;
    
      file1=fopen(filename,"r");
      if(file1==NULL)
      {
        printf("fehler beim lesen");
    	exit(-1);
      }
    
      file2=fopen("gerade.txt","w");
      if(file1==NULL)
      {
        printf("fehler beim schreiben");
    	exit(-1);
      }
      file3=fopen("ungerade.txt","w");
      if(file3==NULL)
      {
        printf("fehler beim schreiben");
    	exit(-1);
      }
    
      while(!foef(file1))
      {
        fscanf(file1,"%1d",&c);
    
    	if(c%2 == 0)
    	{
    	  fprintf(file2,"%d",c);
    	}
    	else
    	{
    	  fprintf(file3,"%d",c);
        }  
      }
    
      fclose(file1);
      fclose(file2);
      fclose(file3);
    }
    
    int main()
    {
      char filename[50]="zahlen.txt";
    
      zahlen(filename);
    
      return(0);
    }
    


  • Billy schrieb:

    Nur kommen 2 Fehler die ich überhaupt nicht kenne(Anfänger 😉 ) und noch nie gehabt habe.

    1>C:\Dokumente und Einstellungen\....\Eigene Dateien\Visual Studio 2008\Projects\file003.c\Debug\file003.c.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise
    
    1>file003.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_foef" in Funktion "_zahlen".
    

    So etwas nennt sich Buchstabendreher 😉
    Obwohl, eigentlich hätte der Compiler dich auch schon auf die undefinierte bzw. implizit deklarierte Funktion hinweisen sollen.

    PS: Ist das richtig, daß in der Datei nur eine einzige Zahl steht? Wenn nein, was genau erwartest du als Ergebnis? (Edit: hat sich erledigt)

    PPS: Nur ein Vorschlag - verwende bitte Variablennamen, die auch ein wenig Informationsgehalt haben. "eingabe", "gerade" und "ungerade" sind wesentlich aussagekräftiger als "file1", "file2" und "file3".



  • So etwas nennt sich Buchstabendreher 😉
    Obwohl, eigentlich hätte der Compiler dich auch schon auf die undefinierte bzw. implizit deklarierte Funktion hinweisen sollen.

    PS: Ist das richtig, daß in der Datei nur eine einzige Zahl steht? Wenn nein, was genau erwartest du als Ergebnis?

    Naja, ich das hab ich mir so gedacht:
    Ich hab ein Textdokument vorgegeben. Nämlich zahlen.txt --> hier steht drinnen:
    56851526

    mit fscanf(zahlen,"%1d",c);---> leist ja 5 speichert es in c ---> liest dann 6 speichert es in c usw.

    Die if überprüft halt ob es eien gerade oder eine ungerade Zahl ist.
    Gerade zahlen werden in gerade.txt gespeichert und ungerade Zahlen in ungerade.txt



  • Billy schrieb:

    So etwas nennt sich Buchstabendreher 😉
    Obwohl, eigentlich hätte der Compiler dich auch schon auf die undefinierte bzw. implizit deklarierte Funktion hinweisen sollen.

    PS: Ist das richtig, daß in der Datei nur eine einzige Zahl steht? Wenn nein, was genau erwartest du als Ergebnis?

    Naja, ich das hab ich mir so gedacht:
    Ich hab ein Textdokument vorgegeben. Nämlich zahlen.txt --> hier steht drinnen:
    56851526

    mit fscanf(zahlen,"%1d",c);---> leist ja 5 speichert es in c ---> liest dann 6 speichert es in c usw.

    OK, ich nehme mein PS von oben zurück - ich hatte 1 dort oben übersehen.



  • Sorry, aber was soll ich jetzt machen :)?



  • Billy schrieb:

    Sorry, aber was soll ich jetzt machen :)?

    z.b. verklickern, wie viele zahlen in der textdatei stehen



  • Billy schrieb:

    Sorry, aber was soll ich jetzt machen :)?

    mach den buchstabendreher raus, kompiliere und lass laufen.



  • Ich weis net ganz was du meinst.
    in zahlen.txt steht: 54



  • mach feof() statt foef()



  • while(!feof(file1))
      {
        fscanf(file1,"%1d",&c);
    

    Und wenn du mal was anderes als Ziffern in der Datei stehen hast, z.B. Buchstaben, erlebst du eine wunderschöne Endlosschleife. Deshalb und nicht nur deshalb bleibt dein Code Stümperei.



  • so ist es... daher:

    gesammte datei auslesen (als string) und die strings bearbeiten, zahlen raussuchen
    umwandeln von char in int und fertig... alles andere ist fehlerhaft, vorab wenn
    man wenig erfahrung mit files hat.



  • Ich würde da eher Zeilenweise auslesen (Wenn imer eine Zahl in einer Zeile steht). Also immer bis zu einem Zeilenumbruch (\n). Die Strings kann man dann mittels atoi umwandeln.



  • Jochen S. schrieb:

    .... Die Strings kann man dann mittels atoi umwandeln.

    Besser noch strtol(). Denn das kann dir noch mitteilen wo es nicht mehr umwandeln konnte.



  • DirkB schrieb:

    Jochen S. schrieb:

    .... Die Strings kann man dann mittels atoi umwandeln.

    Besser noch strtol(). Denn das kann dir noch mitteilen wo es nicht mehr umwandeln konnte.

    soweit ich weiss, wandelt atoi "gnadenlos" um. Da machen dann auch Buchstaben nichts aus. "12xyz" wird dann einfach zu 12.



  • Jochen S. schrieb:

    DirkB schrieb:

    Jochen S. schrieb:

    .... Die Strings kann man dann mittels atoi umwandeln.

    Besser noch strtol(). Denn das kann dir noch mitteilen wo es nicht mehr umwandeln konnte.

    soweit ich weiss, wandelt atoi "gnadenlos" um. Da machen dann auch Buchstaben nichts aus. "12xyz" wird dann einfach zu 12.

    strtol() wandelt genauso "gandenlos" um, allerdings sagt es dir zusätzlich noch, daß es mit dem Teil ab 'x' nichts mehr anfangen konnte.

    (um einzelne Ziffern zu verarbeiten, braucht man übrigens keine so aufwendigen Funktionen, da reicht eine einfache Subtraktion:

    char c=fgetc(file1);
    if(isdigit(c))
    {
      int n=c-'0';
      ...
    }
    else
    {
      printf("unbekanntes Zeichen in der Eingabe\n");
    }
    


  • Gut, aber wenn in der Datei nur Zahlen sind, ist es ja egal, ob man nun atoi oder strtol verwendet. In deinem Code könnte man noch auf isdigit verzichten:

    char c=fgetc(file1);
        int n=c-'0';
    
        if(n<0||n>9)printf("unbekanntes Zeichen in der Eingabe\n");
    

    Oder täusche ich mich da etwa?


Anmelden zum Antworten