Zahlen von Textdatei einlesen in array



  • Hallo,

    ich hab folgendes Problem:
    Ich habe eine Textdatei mit zahlen welche durch Leerzeichen getrennt sind.
    Also 1 2 3 4 etc
    Diese will ich nun einlesen in mein Programm und dann gleich in in eine Matrix und einen Vektor packen.
    Die Matrix hat 10 x 2 Format wobei die erste Spalte komplett 1 ist und in die zweite die Werte eingetragen werden sollen.
    Die Schwierigkeit ist nun dass jede zweite Zahl in eben diese Matrix soll,
    und die erste, dritte etc in einen Vektor b.

    Ich habe mal so angefangen: m x n matrix mit m=10, n=2

    Vektoren/Matrix Definition:

    b = malloc(sizeof (double*)*m);
    
    //Assigning A matrix
    a = malloc(sizeof (double*)*m); //allocate M rows to dmatrix
    
    for (i =0; i < m; i++)
    {a[i] = malloc (sizeof (double)*n);}
    
    fp = fopen("Datei", "r");
    
    if(fp == NULL) {
    	printf("Datei konnte nicht geoeffnet werden.\n");
    }else {
        if (i %2 == 0){
    	for(i=0; i<20; i++) {
    		fscanf(fp, "%d\n", &a[1][i/2]);
    		a[0][temp]=1
    	}
    	else {
            for(i=0; i<20; i++) {
    		fscanf(fp, "%d\n", &b[(i-1)/2]);
    

    Ich mache also erst einen Durchlauf für alle geraden i und packe die in die Matrix a in die zweite Spalte und dann mache ich es für die ungeraden i und packe es in den Vektor b
    Das scheint mir aber unnötig kompliziert und ist auch nicht zielführend



  • - hier ist nirgendwo ein Array
    - das ist kein vollständig compilierbares Beispiel
    - du benutzt keine C-Codetags
    - deine Frage ist?


  • Mod

    Matrixartige Datenstrukturen sind besser an einem Stück zu allokieren. Was du derzeit hast ist eher eine beliebig große Liste von anderen beliebig großen Listen, du hast es bloß so arrangiert, dass diese Größe überall gleich ist.

    Da du sagst, dass die Matrix stets 10x2 hat, ist dynamische Speicherverwaltung sowieso fragwürdig. Falls die 10 in Wirklichkeit eine beliebige Zahl ist (und die 2 fest), dann wäre es passender, einen Speicherbereich für die passende Zahl von double[2]-Arrays zu reservieren ( double (*x)[2] = malloc(sizeof(*x) * length) ). Falls die 2 ebenfalls nicht fest sein sollte, macht die Frage keinen Sinn mehr.

    Bezüglich Einlesen: Es ist nicht verboten, auch mal mehrere Werte gleichzeitig zu lesen und nach Bedarf zu verteilen:

    while(scanf("%lf %lf", in_die_matrix, in_den_vektor)==2)
    


  • Ja die 10 sind eigentlich beliebig nur in dem Datensatz halt genau 10.
    Die 2 Spalten sind fest (kommt von einem Linearen Ausgleichsproblem).

    Sry die Code tags hab ich vergessen.

    Meine Frage ist wie man am geschicktesten so etwas einließt.

    Die Idee von SeppJ klingt gut.
    Sollte das nicht fscanf dann aber sein wenn man es von einer Text datei einließt?
    Wenn du die While schleife nimmst mit den 2 eingelesenen:
    Ich komm nicht so richtig klar, dass das dann genau in die 2te Spalte muss der Matrix.
    Ich benutze als Abbruchkriterium i<20 weil 20 zahlen drin liegen.

    while (i<20)
    {
    fscanf("%lf %lf, &a[2][i] ,&b[i]);
    ++i
    }
    

  • Mod

    Du stellst wieder keine Frage. Ich rate daher (ein letztes Mal), was du wohl wissen möchtest:
    * Ob du scanf, fscanf, sscanf oder wer weiß was benutzt, ist für das hier gezeigte Prinzip unerheblich. So viel Transferleistung traue ich dir zu.
    * Du kannst Schleifen deiner Wahl benutzen. Derzeit scheinst du aber keinen Plan zu haben, wie die verschiedenen Schleifen überhaupt funktionieren. Das solltest du an einfacheren Beispielen üben. Schreib mal ein Programm, welches mittels Schleifen folgende Ausgabe erzeugt:

    1 0 11
    1 1 12
    1 2 13
    1 3 14
    1 4 15
    1 5 16
    1 6 17
    1 7 18
    1 8 19
    1 9 20
    

    Eine andere Sachen, die du nicht "gefragt" hast: Guck dir Arrayindizes noch einmal an. Ganz dringend.



  • #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
      enum {ZEILEN=10,SPALTEN=2};
      FILE *f = fopen("/tmp/datei.txt","w");
      fputs("0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20",f);fclose(f);
    
      f=fopen("/tmp/datei.txt","rb");
      if(f)
      {
        int i;
        double (*m)[SPALTEN]=malloc(sizeof**m*ZEILEN*SPALTEN); /* Definition Matrix */
        double *v=malloc(sizeof*v*ZEILEN);  /* Definition Vektor */
        for(i=0;i<ZEILEN && 2==fscanf(f,"%lf%lf",&m[i][1],&v[i]);++i) /* Pärchen einlesen bis 10 oder Dateiende/Inhaltsfehler */
        {
          m[i][0]=1;
        }
    
        for(int j=0;j<i;++j) for(int k=0;k<2;++k) printf("m[%d][%d]=%f\n",j,k,m[j][k]);
        for(int j=0;j<i;++j) printf("v[%d]=%f\n",j,v[j]);
        free(v);free(m);fclose(f);
      }
      else
        perror("/tmp/datei.txt");
    
      return 0;
    }
    

    https://ideone.com/4LnghS


Log in to reply