Einlesen aus txt Datei

KT-studentin

Grünschnabel
also ich habe folgendes Problem, ich muss ein Programm schreiben der daten aus txt datei einliest und dann sortiert und anschließend ausgibt
die txt datei sieht so aus
12 23 45
23 33 4
2 2 22
12 3 33
10 werte und die sollen nach
durchmesser länge zahl
soriert werden
ich habe ein code aber weiss nicht wie ich weiter komme
Danke für eure hilfe im vorraus

Code:
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <process.h> //für fprintf 
void selection(int *array, int elemente) {
   int index,index_klein,
       wert, wert_klein;
   /* Schleife durchläuft von links nach rechts */
   for(index = 0; index < elemente; index++) {
      /* Aktuelle Position */
      wert=index;
      /* Schleife durchläuft bis kleineres Element als
       * aktuelle Pos. gefunden wurde oder bis zum Ende,
       * was bedeutet, die aktuelle Position ist schon
       * das kleinste */
      for(index_klein = index+1; index_klein <= elemente;
        index_klein++) { /* Ein kleineres Element gefunden? */
         if(array[index_klein] < array[wert])
            /* Neues kleinstes Element */
            wert=index_klein;
      }
      /* Kleinstes Element an die aktuelle
       * Position falls nötig */
      if(wert != index) {
         wert_klein=array[wert];
         array[wert]=array[index];
         array[index]=wert_klein;
      }
   }
}
int main(void) {
   int i;
   FILE *test_array[i];
   /* Das Array zum Sortieren */
   test_array[] = fopen("schrauben.txt","r");
   int N = sizeof(test_array)/sizeof(int);
   selection(test_array, N-1);
   for(i = 0; i < N; i++)
      printf("%d ", test_array[i]);
   printf("\n");
   fclose(datei);
   return EXIT_SUCCESS;
   }
 
Willkommen im Forum!

Erstens: Kann ja sein, dass ich schwer von Begriff bin, aber was ist mit Durchmesserlängezahl gemeint?
Ist die erste Zahl pro Zeile ein Durchmesser, die Zweite eine Länge...etc und davon 10 Zeilen, die nach Durchmesser, bei gleichem nach Länge etc sortiert werden?

Ich nehms einmal so an.

Im main fallen mir einige seltsame Sachen auf:
1: int i;
und dann ein Array von der Länge i - noch dazu ohne vernünftigen Wert in i - :suspect:
Für was braucht man ein Array mit -2 Milliarden etc etc Elementen?
Ausserdem sollte die Arraylänge fix sein, sonst braucht man malloc/free

2: Und warum Überhaupt ein Filepointerarray? Du brauchst doch nur einen.

3: Einem ganzen Array oder so mit "array[]=..." was zuweisen klappt nicht.
Wenn du wie in 2 nur noch einen Filepointer hast, lass einfach die [] weg

4: Da du jetzt ja doch ein Array brauchst, mach lieber ein
int array[3];
statt Filepointer, dass 3 muss man halt durch die gewünschte Größe ersetzen
Scheint (zumindest im main zurzeit) nicht so, dass die Größe veränderbar sein sollte, also einfach einmal so nehmen.

5: Das int N musst du nicht berechnen, weil es (zB bei einem Array wie in 4) 3 wäre.
In deinem Code (wenn er mit malloc... ergänzt wird und ein int-Array genommen wird), wäre das i

6: Beim selection wäre das N ohne -1 wahrscheinlich sinnvoller (hab mir selection noch nicht angeschaut)
Aber wie in 5 schon gesagt, kann man auf das N eigentlich verzichten und die Zahl selber übergeben, solange das Array eine fixe Größe hat.

So...selection werd ich mir gleich anschauen...

edit: Jetzt hab ich doch glatt das Einlesen selber vergessen :-)
Wenn immer genau 10 solche Dreierblocke drinnenstehen, kannst du für die int-Array-Größe einmal 30 nehmen
und dann sowas in der Art:
C++:
for(int j=0;j<10;j++)
    fscanf(file,"%d %d %d",array[i*3],array[i*3+1],array[i*3+2]);

Und braucht man include iostream und include process hier wirklich? Glaub nicht

Hab jetzt selection einmal überflogen, das sieht eher nach einer eindim. Sortierung aus...
Ich muss jetzt nocheinmal nachfragen, gehören wirklich immer 3 Werte zusammen oder irre ich mich da?
 
Zuletzt bearbeitet:
erstens vielen dank für die antwort
2 ja es sind immer pro zeile 3 werte zu lesen 1x durmesser 1xlänge und 1xanzahl
ich werde mal versuchen dein rat zu folgen und schaue was ich da schaffe
Grüße
 
C++:
void selection(int *array, int elemente)
{
  char a=1,b;int i,j;
  while(a)
  {
    a=0;
    for(i=0;i<(elemente-3);i+=3)
    {
      b=0;
      if(a[i]>a[i+3])b=1;
      else if(a[i]==a[i+3])
      {
        if(a[i+1]>a[i+4])b=1;
        else if(a[i+2]==a[i+4])
        {
          if(a[i+2]>a[i+5])b=1;
        }
      }
      if(b)
      {
        a=1;
        a=array[i];array[i]=array[i+3];array[i+3]=a;
        a=array[i+1];array[i+1]=array[i+4];array[i+4]=a;
        a=array[i+2];array[i+2]=array[i+5];array[i+5]=a;
      }
    }
  }
}

Ist zwar alles andere als effizient, aber für Mengen in der Größenordnung 10, 20... sollte es noch nicht zu langsam werden.

Im Prinzip geht es das Array durch und schaut sich dabei immer 2 Einträge an, zB
1 und 2, 2 und 3 etc
Wenn das "kleinere" von den beiden hinten ist, werden sie vertauscht

Und das ganze wird immer wieder gemacht, bis bei einem kompletten Durchgang einmal nichts mehr zum Tauschen war :)

Wie gesagt, könnte von der Geschwindigkeit um einiges besser sein, aber für 10 dürften keine störenden Wartezeiten auftreten :)

Eine vernünftigere Lösung wäre, eine Vergleichsfunktion fürs quicksort zu schreiben;
aber da sich das ganze nach Schul (oder Studien- etc) aufgabe anhört, weiss ich nicht, ob das verwendet werden darf?
 
Zuletzt bearbeitet:
viiiiiiiiiiiiiiiiiiiiiielen dank für die hilfe
es ist leider so eine aufgabe die nur so gemacht weden darf
aber ich bekomme immer fehler gerade
12 type error: pointer expected
und nochmal danke
 
Was ist denn in Zeile 12?
Zeig am besten mal den aktuellen Code komplett

uuups, hab einen blöden fehler:

in selection zwischen
b=0;
und
if(b)
gehört überall array statt a

sorry da hab ich die falsche Variable genommen
 
Zuletzt bearbeitet:
Zurück