Beim Programmstart sofort Werte übergeben und sortieren



  • Hallo,

    ich habe ein Problem bei einer Aufgabe!
    Ein C Programm soll bestimmte Integer-Werte, die in einer Datei stehen sortieren.
    Der Aufruf sieht wie folgt aus. a.out < sort.dat

    Wie bekomme ich nun die Werte in mein C Programm. Als Hilfe bekam ich, dass ich das mit scanf machen muss, aber wie???

    Den Anfang habe ich schon:

    #include <stdio.h> 
    
    int main( int argc, char *argv[] ) { 
    
      const int groesse = 20; 
      int zahlen[groesse]; 
      int i; 
    
      for( i=0; i<groesse; i++ ) { 
    
        scanf("%i\n", &zahlen[i]); 
      } 
    
      for( i=0; i<groesse; i++ ) { 
    
        printf("%i", zahlen[i]); 
      } 
    
      return 0; 
    }
    

    In der Datei sort.dat sind Werte eingetragen:

    12
    32
    45
    33
    22
    12
    0
    

    Max Array größe ich auch vorgegeben also 20.

    Die ersten Zahlen werden ausgelesen, aber danach kommen Zahlen, die dort nicht eingetragen sind. Es werden also mehr Zahlen ausgegegeben als vorhanden.

    Kann ich nicht irgendwie eof() benutzen. Eigentlich muss ich doch die Daten auslesen bis "/0" terminierender NullByte



  • Du ließt "groesse" Zahlen ein und gibst auch "groesse" zahlen wieder aus.
    Deine datei hat aber nur 7 Einträge. Bei den weiteren würde dir scnaf einen Fehler zurückgeben (dann weißt du auch, wieviel wirklich drinstehehn)
    aber du wertest den rückgabewert von scanf ja nicht aus:

    The return value of scanf() is the number of variables that were successfully assigned values, or EOF if there is an error.

    Gruß Andy



  • Dein Formatstring ist falsch... Versuch mal:

    scanf("%d", &zahlen[i]);
    


  • wwwAndy schrieb:

    Du ließt "groesse" Zahlen ein und gibst auch "groesse" zahlen wieder aus.
    Deine datei hat aber nur 7 Einträge. Bei den weiteren würde dir scnaf einen Fehler zurückgeben (dann weißt du auch, wieviel wirklich drinstehehn)
    aber du wertest den rückgabewert von scanf ja nicht aus:

    The return value of scanf() is the number of variables that were successfully assigned values, or EOF if there is an error.

    Gruß Andy

    Ja, weil ich vorher nie weiß, wie viele Zahlen in der Datei steht. Es können aber nicht mehr 20 Zahlen drin stehen, deshalb das Maximum 20.



  • ProgChild schrieb:

    Dein Formatstring ist falsch... Versuch mal:

    scanf("%d", &zahlen[i]);
    

    das spielt keine Rolle ob ich %d oder %i benutze es kommt das gleiche Ergebnis



  • Peter T schrieb:

    das spielt keine Rolle ob ich %d oder %i benutze es kommt das gleiche Ergebnis

    Nicht ganz. Wenn deine Zahl mit einer 0 beginnt wird sie als Oktal gelesen. Wenn sie mit 0x anfängt, wird sie als Hexadezimal gelesen. Das ist ehr selten beabsichtigt.



  • #define GROESSE 20
    
    int main( int argc, char *argv[] ) 
    {
      int zahlen[GROESSE];
      int i, s;
    
      for( i=0; i<GROESSE; i++ ) 
        if (1 != scanf("%i\n", &zahlen[i]))
            break;
    
      for( s=0; s<i; s++ ) 
        printf("%i\n", zahlen[s]);
    
      return 0;
    }
    

    😉 :xmas2:



  • OK Danke das auslesen funktioniert schon.

    Hab noch ein Problem beim Start.

    Ich hab eine Datei (sort.dat), die ich an das Programm, in Form programm.out < sort.dat übergebe.

    Wenn ich aber nur programm.out schreibe. Stürzt das Programm ab.
    Also brauche ich eine Fehlerabfrage.

    Überlegt habe ich das in so:

    if( argc <= 1 ) {
    
      printf("Fehler!");
      return -1;
    }
    

    Leider klappt das nicht, wie kann ich es denn verhindern



  • Peter T schrieb:

    Wenn ich aber nur programm.out schreibe. Stürzt das Programm ab.

    das sollte nicht sein. das programm wartet dann darauf, dass du die zahlen von hand eingibst
    :xmas2:



  • Eine Frage zum Quelltext habe ich noch.

    if (1 != scanf("%i\n", &zahlen[i]))

    warum heißt es hier ungleich 1???



  • Peter T schrieb:

    warum heißt es hier ungleich 1???

    wenn scanf keinen wert mehr (!=1) einlesen konnte, wird die schleife abgebrochen.



  • Eine Alternative wäre es, nicht über die Pipes zu gehen:

    int main( int argc, char *argv[] ) 
    {
      int zahlen[GROESSE];
      int i, s;
      FILE* data;
    
      if(argc<2)
      {
        printf("Bitte Quelldatei angeben!\n");
        exit(1);
      }
    
      data = fopen(argv[1],"r");
    
      for( i=0; i<GROESSE; i++ ) 
        if (1 != fscanf(data,"%i\n", &zahlen[i]))
            break;
    
      for( s=0; s<i; s++ ) 
        printf("%i\n", zahlen[s]);
    
      return 0;
    }
    

    (aufgerufen wird das dann per "programm.out sort.dat")



  • Danke, aber das sollte ich ja nicht machen.
    Das hätte ich auch geschaft.

    Das Programm sollte schon mit programm.out < sort.dat aufgerufen werden.

    Aber trotzdem danke


Log in to reply