C programmieren arrays verketten

makke306

Lt. Junior Grade
Registriert
Mai 2010
Beiträge
291
Hallo ich habe folgendes Problem:


Ich habe Daten die ich in C einlesen möchte und diese umsortieren möchte da diese total unpraktisch formatiert sind. Ich habe ein stringarray, von [0] bis [1000000].

Ich möchte dass das array [3] mit dem array [22] und mit dem array [41] verkettet wird.

Siehe dazu den Screenshot, also das array von 22-40 sollte an [3] angehängt werden, so wie das array 41-58 an das array 22 angehängt werden sollte. Dies sollte dann immer wieder wiederholt werden. Als Ergebnis habe ich sen Screenshot Nachher angehängt so wie es dann aussehen sollte.

Ich habe versucht die Daten so umzusortieren bzw. zu verketten, aber ohne guten Erfolg. Dazu hatte ich ein neues array erstellt wo ich versucht habe mit einer for Schleife die Daten reinzuschreiben.

Kann mir dabei jemand helfen bzw. sagen ob und wie ich das Lösen kann? Danke!

Hier der Code auf onlinegdb: https://onlinegdb.com/tkgGogee4
 

Anhänge

  • Vorher.png
    Vorher.png
    113,2 KB · Aufrufe: 274
  • Nachher.JPG
    Nachher.JPG
    133,4 KB · Aufrufe: 272
Zuletzt bearbeitet:
ich sehe in deinem Code nicht was du versucht hast und nicht geht - so kann man nicht helfen meiner Meinung nach.
Positiv ist natuerlich das du quasi den Stub fuer ein MWE/MCWE bereitgestellt hast. Das ist praktisch. Nicht dass ich hier alles schlecht reden will, bei weitem nicht.

Konstruktiv helfen waere aber bei den C Experten sicher besser.

Interesse-halber: Warum willst du uebehaupt C nehmen? Waere nicht Python + Pandas eine attraktivere Option fuer deine CSV Daten? Oder praeferierst du einfach C weil du es besser kannst?
 
  • Gefällt mir
Reaktionen: BeBur und madmax2010
Erstmal: warum die CSVs formatiert im code?
Was ist die Aufgabe?
Genereller Code zum Appenden von arrays findet sich in der Antwort hier: https://stackoverflow.com/a/11932500
Ist meine Basis seitdem ich damals C gelernt habe. Wobei C wirklich nicht viel Spass macht, wenn man mit vieen Tabellen arbeitet
 
Hm, das Umsortieren macht man normalerweise sehr angenehm mit sed, awk, head, tail, cut usw. auf der Linux Kommandozeile, ggf. unter Zuhilfenahme von Schleifen.
 
Erste Frage:
Ist das eine Hausaufgabe?

Zweitens:
Ohne das kleine Beispiel zu compilieren, nenne bitte die ermittelte Zeichenkettenlänge.
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int len;
    char * kette="Dies ist \n"
                 "ein Test-String\n";
    printf("%s", kette);
    len = strlen(kette);
    printf("len=%d \n", len);
    return 0;
}

Drittens:
Die Datei soll ein 2-dimensionales Array abbilden, tut sie aber nicht, ergo musst du es machen, wenn sie eingelesen wird. Das vereinfacht die weitere Auswertung.

ANZAHL 1000000 wofür? Soll das eine grobe Sicherheit bilden, weil du die Zahl der Zeichen nicht kennst? Doch die kennst, die kennst du!

Ist BUFLEN 4096 einfach nur wieder grob geraten? Warum? Die Zahl der Zeichen einer Zeile lässt sich doch aus der Datei ermitteln, wenn man Newline als Zeilentrenner auswertet.

Con ncon **Con , was geht denn hier ab? Sind dir keine griffigen Bezeichner eingefallen. Wozu benötigst du Doppel-Pointer? Oder ist es Teil der Hausaufgabe unbedingt das Problem mit Pointer-auf-Pointer zu lösen?

Ein String in C wird Null-terminiert, das wäre "\0" oder einfach die dezimal 0, "\n" (Newline) ist dezimal 10.

Da deine Datei ASCII basiert ist, entspricht der Puffer einfach der Dateigröße.
Die Länge einer Zeile wird durch das Vorkommen von "\n" bestimmt.

Eine mögliche Lösung ist es, jede 18 oder 19 Zeile an die vorherige zu kopieren, dafür bietet string.h entsprechende Funktionen.
 
Zuletzt bearbeitet: (Edit: falschen Wert für "\n" korrigiert)
Danke für die Hinweise. Ich muss mir die Grundlagen noch ein bisschen besser ansehen. Anzahl wäre die Anzahl der Zeilen und ja BUFLEN habe ich grob geraten.

Dann sollte ich die Daten in einem 2D Array abbilden? Also in einem Eintrag steht die Nummerierung und in dem zweiten der String bzw. die gesamte Zeile bis\n?

Ich versuche es selbst nochmals und werde dann hier mein Ergebnis mitteilen.
 
Ich weiß aus eigener Erfahrung, dass es gar nicht so einfach ist Code für andere lesbar zu erstellen. Man kann seine Variablen gerne pippi, kacka, popo nennen, aber spätestens wenn man Hilfe braucht, wird daraus ein Bumerang.

Es wird kommentiert, was nicht sofort ersichtlich ist.
Es wird nicht kommentiert, was keiner Erklärung bedarf. (Zählervariablen für Schleifen z.B. und API function calls, C functions )

Zerlege den Code in Subroutinen.
Erstelle main.c mit den notwendigen Funktionen.
Erstelle eine Header Datei.

Beispiel string_reorder.c

C:
/*
    author
    datum

*/


/*
    kommentarbereich
    aufgabe umschreiben

*/

/*
    kommentarbereich
    lösungsweg beschreiben

*/


#include "string_reorder.h"

int main() {
    getfilesize();
    getlinesize();
    create_array();
    readfile();
    copystrings()
    cleanup();
    return 0;
}

Beispiel für string_reorder.h

C:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define blablabla (Makros, symbolische Konstanten)


/******************************************
 * Definitionen der Funktionen
 *****************************************/

/*
 *  funktion zur bestimmung der dateigröße
 *  mittes fseek() und ftell()
*/
int  getfilesize() {

}

/*
 * funktion zur bestimmung der länge eines strings
 * mittels fgetc() 
*/
int  getlinesize() {

}


/*
 *   
*/
void create_arry() {

}


/*
 *   
*/
void readfile() {

}


/*
 *  funktion zum kopieren in richtiger reihenfolge 
*/
void copystrings() {

}


/*  Funktion zum Aufräumen vor dem Programmende
 *  sofern überhaupt nötig offene dateien schliessen
 *  speicher freigeben 
*/
void cleanup() {

}

Folgende Funktionen brauchen keine expliziten Kommentare (meiner Meinung nach).
C-funktionen werden nicht kommentiert. Die Bezeichner sind selbsterklärend.
Der Code wurde von mir NICHT gestestet.

C:
/* Funktion zur Ermittlung der Dateigröße
*/

long get_file_size(char *filename) {
    FILE *fp = fopen(filename, "r");

    if (fp==NULL)
        return -1;

    if (fseek(fp, 0, SEEK_END) < 0) {
        fclose(fp);
        return -1;
    }

    long size = ftell(fp);
    fclose(fp);
    return size;
}

/* funktion zur Ermittlung der Zeilenlänge
*/

long int get_line_size(char * filename){
    long int count = 0; char c;
    FILE * fp;

    fp = fopen(filename,"r");
    do {
      c = fgetc(fp);
      if( feof(fp) ) {
         break;
      }
      if(c == "\n") {
        break;
      }
      count++;
   } while(1);

   fclose(fp);
   return count;
}

Wenn man strukturiert programmiert, macht man es sich leichter den eigenen Code später woanders weiter zu verwenden. Und es erhöht für andere die Lesbarkeit enorm.
 
@Plaste: Danke für die Tipps. Bin gerade fertig geworden mit meiner Neuen Version. Und es funktioniert nun so wie ich mir das vorgestellt habe. Ich habe zwar keine Header Datei erstellt aber meiner Ansicht nach etwas übersichtlicher gemacht.
Vermutlich könnte man dies sicher noch sauberer programmieren aber es erfüllt zumindest den Zweck. Hier der Link mit dem man es online ausführen kann:
https://onlinegdb.com

Ich muss nur noch eine while Schleife einbauen die mir das x-mal wiederholt, da es ein größerer Datensatz ist. Dafür muss ich die Zählvariabeln i,j,k,m immer updaten, da muss ich mir noch was überlegen. Aber das mache ich später da ich aktuell keine Zeit mehr habe.

C:
#include <stdio.h>  // standard input output
#include <stdlib.h> // standard bibliothek
#include <string.h> // strings
#define MAX_LINE_LENGTH 300 // maximal length of a line of the input file
#define Max_LINE_LENGHT_APPENDED 1000 // maximal length of full appendet line
#define MAX_LINES 59 // maximal lines of the original input file


int main()
{
    const char FILEIN[] = "/tmp/abc123";
    FILE *fpp=fopen("/tmp/abc123", "w");
    fputs(" \n"
"  \n"
"  \n"
"   PERMNO         date   CUSIP      NCUSIP     COMNAM                                TICKER       PERMCO   SHRCD   SHRCLS     ISSUNO   EXCHCD   HEXCD      SICCD     HSICCD   HSICMG   HSICIG     NAMEENDT   TSYMBOL      NAICS     PRIMEXCH   TRDSTAT   SECSTAT\n"
" \n"
"    10000   06/01/1986   68391610                                                                   7952     .                 10396      .       3            .       3990     39       399             .                                                      \n"
"    10000   07/01/1986   68391610   68391610   OPTIMUM MANUFACTURING INC             OMFGA          7952    10      A          10396      3       3         3990       3990     39       399    03/12/1986   OMFGA                     Q          A         R   \n"
"    10000   08/01/1986   68391610   68391610   OPTIMUM MANUFACTURING INC             OMFGA          7952    10      A          10396      3       3         3990       3990     39       399             .   OMFGA                     Q          A         R   \n"
"    10000   09/01/1986   68391610   68391610   OPTIMUM MANUFACTURING INC             OMFGA          7952    10      A          10396      3       3         3990       3990     39       399             .   OMFGA                     Q          A         R   \n"
"    10000   10/01/1986   68391610   68391610   OPTIMUM MANUFACTURING INC             OMFGA          7952    10      A          10396      3       3         3990       3990     39       399             .   OMFGA                     Q          A         R   \n"
"    10000   13/01/1986   68391610   68391610   OPTIMUM MANUFACTURING INC             OMFGA          7952    10      A          10396      3       3         3990       3990     39       399             .   OMFGA                     Q          A         R   \n"
"    10000   14/01/1986   68391610   68391610   OPTIMUM MANUFACTURING INC             OMFGA          7952    10      A          10396      3       3         3990       3990     39       399             .   OMFGA                     Q          A         R   \n"
"    10000   15/01/1986   68391610   68391610   OPTIMUM MANUFACTURING INC             OMFGA          7952    10      A          10396      3       3         3990       3990     39       399             .   OMFGA                     Q          A         R   \n"
"    10000   16/01/1986   68391610   68391610   OPTIMUM MANUFACTURING INC             OMFGA          7952    10      A          10396      3       3         3990       3990     39       399             .   OMFGA                     Q          A         R   \n"
"    10000   17/01/1986   68391610   68391610   OPTIMUM MANUFACTURING INC             OMFGA          7952    10      A          10396      3       3         3990       3990     39       399             .   OMFGA                     Q          A         R   \n"
"    10000   20/01/1986   68391610   68391610   OPTIMUM MANUFACTURING INC             OMFGA          7952    10      A          10396      3       3         3990       3990     39       399             .   OMFGA                     Q          A         R   \n"
"    10000   21/01/1986   68391610   68391610   OPTIMUM MANUFACTURING INC             OMFGA          7952    10      A          10396      3       3         3990       3990     39       399             .   OMFGA                     Q          A         R   \n"
"    10000   22/01/1986   68391610   68391610   OPTIMUM MANUFACTURING INC             OMFGA          7952    10      A          10396      3       3         3990       3990     39       399             .   OMFGA                     Q          A         R   \n"
"    10000   23/01/1986   68391610   68391610   OPTIMUM MANUFACTURING INC             OMFGA          7952    10      A          10396      3       3         3990       3990     39       399             .   OMFGA                     Q          A         R   \n"
"    10000   24/01/1986   68391610   68391610   OPTIMUM MANUFACTURING INC             OMFGA          7952    10      A          10396      3       3         3990       3990     39       399             .   OMFGA                     Q          A         R   \n"
"    10000   27/01/1986   68391610   68391610   OPTIMUM MANUFACTURING INC             OMFGA          7952    10      A          10396      3       3         3990       3990     39       399             .   OMFGA                     Q          A         R   \n"
" \n"
"          PRC          VOL        OPENPRC          ASKHI          BIDLO           BID           ASK   NUMTRD           RET          RETX   SHROUT   SHRFLG     SHRENDDT   DLSTCD   NWPERM       NEXTDT          DLAMT          DLPRC        DLPDT         DLRET\n"
" \n"
"       .                 .         .              .              .             .             .             .       .             .              .       .             .      .          .            .         .              .                 .       .      \n"
"     -2.56250         1000         .             2.75000        2.37500        .             .             .       C             C           3680       2    30/01/1986      .          .            .         .              .                 .       .      \n"
"     -2.50000        12800         .             2.62500        2.37500        .             .             .     -0.024390     -0.024390     3680       .             .      .          .            .         .              .                 .       .      \n"
"     -2.50000         1400         .             2.62500        2.37500        .             .             .      0.000000      0.000000     3680       .             .      .          .            .         .              .                 .       .      \n"
"     -2.50000         8500         .             2.62500        2.37500        .             .             .      0.000000      0.000000     3680       2             .      .          .            .         .              .                 .       .      \n"
"     -2.62500         5450         .             2.75000        2.50000        .             .             .      0.050000      0.050000     3680       .             .      .          .            .         .              .                 .       .      \n"
"     -2.75000         2075         .             2.87500        2.62500        .             .             .      0.047619      0.047619     3680       .             .      .          .            .         .              .                 .       .      \n"
"     -2.87500        22490         .             3.00000        2.75000        .             .             .      0.045455      0.045455     3680       .             .      .          .            .         .              .                 .       .      \n"
"     -3.00000        10900         .             3.12500        2.87500        .             .             .      0.043478      0.043478     3680       .             .      .          .            .         .              .                 .       .      \n"
"     -3.00000         8470         .             3.12500        2.87500        .             .             .      0.000000      0.000000     3680       .             .      .          .            .         .              .                 .       .      \n"
"     -3.00000         1000         .             3.12500        2.87500        .             .             .      0.000000      0.000000     3680       .             .      .          .            .         .              .                 .       .      \n"
"     -3.00000         1000         .             3.12500        2.87500        .             .             .      0.000000      0.000000     3680       .             .      .          .            .         .              .                 .       .      \n"
"     -3.00000         2700         .             3.12500        2.87500        .             .             .      0.000000      0.000000     3680       .             .      .          .            .         .              .                 .       .      \n"
"     -3.75000        24000         .             3.87500        3.62500        .             .             .      0.250000      0.250000     3680       2             .      .          .            .         .              .                 .       .      \n"
"     -4.18750        11372         .             4.37500        4.00000        .             .             .      0.116667      0.116667     3680       2             .      .          .            .         .              .                 .       .      \n"
"     -4.43750        16570         .             4.50000        4.37500        .             .             .      0.059701      0.059701     3680       2             .      .          .            .         .              .                 .       .      \n"
" \n"
"      DLRETX   DISTCD         DIVAMT         FACPR        FACSHR    CFACPR   CFACSHR       DCLRDT       RCRDDT        PAYDT   ACPERM   ACCOMP   TRTSCD   NMSIND   MMCNT   NSDINX       vwretd       vwretx       ewretd       ewretx       sprtrn\n"
" \n"
"     .             .          .             .             .         .           .               .            .            .        .        .      4        1        0       1      -0.000138    -0.000525     0.001926     0.001783    -0.001091\n"
"     .             .          .             .             .        1.00000     1.00             .            .            .        .        .      1        1        9       2       0.013809     0.013800     0.011061     0.011046     0.014954\n"
"     .             .          .             .             .        1.00000     1.00             .            .            .        .        .      .        .        .       .      -0.020744    -0.020750    -0.005117    -0.005135    -0.027268\n"
"     .             .          .             .             .        1.00000     1.00             .            .            .        .        .      .        .        .       .      -0.011219    -0.011315    -0.011588    -0.011659    -0.008944\n"
"     .             .          .             .             .        1.00000     1.00             .            .            .        .        .      1        1       10       2       0.000083     0.000047     0.003651     0.003632    -0.000728\n"
"     .             .          .             .             .        1.00000     1.00             .            .            .        .        .      .        .        .       .       0.002750     0.002680     0.002433     0.002369     0.003690\n"
"     .             .          .             .             .        1.00000     1.00             .            .            .        .        .      .        .        .       .       0.000366     0.000314     0.004474     0.004439    -0.000387\n"
"     .             .          .             .             .        1.00000     1.00             .            .            .        .        .      .        .        .       .       0.008206     0.008203     0.007693     0.007683     0.007840\n"
"     .             .          .             .             .        1.00000     1.00             .            .            .        .        .      .        .        .       .       0.004702     0.004655     0.005670     0.005653     0.004370\n"
"     .             .          .             .             .        1.00000     1.00             .            .            .        .        .      .        .        .       .      -0.001741    -0.001924     0.003297     0.003222    -0.003538\n"
"     .             .          .             .             .        1.00000     1.00             .            .            .        .        .      .        .        .       .      -0.003735    -0.003735    -0.001355    -0.001356    -0.004318\n"
"     .             .          .             .             .        1.00000     1.00             .            .            .        .        .      .        .        .       .      -0.006992    -0.007012    -0.003472    -0.003494    -0.008384\n"
"     .             .          .             .             .        1.00000     1.00             .            .            .        .        .      .        .        .       .      -0.009593    -0.009605    -0.004588    -0.004599    -0.011176\n"
"     .             .          .             .             .        1.00000     1.00             .            .            .        .        .      1        1       11       2       0.002665     0.002659     0.001397     0.001386     0.003735\n"
"     .             .          .             .             .        1.00000     1.00             .            .            .        .        .      1        1       10       2       0.009683     0.009623     0.006771     0.006750     0.010673\n"
"     .             .          .             .             .        1.00000     1.00             .            .            .        .        .      1        1       11       2       0.004343     0.004120     0.002140     0.001935     0.004650\n"
,fpp);
    fclose(fpp);
 
    // create new file for saving total appended line
      FILE *outputFile = fopen("output.txt", "w");
    if (outputFile == NULL) {
        perror("Error creating output file");
        return 1;
    }

    FILE *fp = fopen("/tmp/abc123", "r");
 
    // Read the lines from the file, the lines are stored in a 2D array for manipulation.
    char lines[MAX_LINES][MAX_LINE_LENGTH];
    int lineCount = 0;
    char line[MAX_LINE_LENGTH];
    while (fgets(line, sizeof(line), fp) != NULL) {
         // Remove newline character from the end of the line
            if (line[strlen(line) - 1] == '\n')
            line[strlen(line) - 1] = '\0';
        strcpy(lines[lineCount], line);
        lineCount++;
    }
    fclose(fp);


    // Append line 41 to 22 and 9 to the end of line 3
    char appendedLine[MAX_LINES][Max_LINE_LENGHT_APPENDED];
    appendedLine[0][Max_LINE_LENGHT_APPENDED]=sprintf(appendedLine[0], "%s%s%s\n", lines[3], lines[22], lines[41]);

    int i=0;
    int j=0;
    int k=0;
    int m=0;
    int count=0;

    for(i=1,j=5,k=24,m=43;  i<=20,j<=20,k<=39, m<=58;  i++,j++,k++,m++)
        {
            appendedLine[i][Max_LINE_LENGHT_APPENDED]=sprintf(appendedLine[i], "%s%s%s\n", lines[j], lines[k], lines[m]);
            count++;
        }



    // Print the result in a new file
    for(int i=0;i<=count;i++)
    {
        fprintf(outputFile,"%s", appendedLine[i]);
    }


 return 0;
}
 
Du kannst in jedem Schleifentyp soviele Variablen hochzählen wie du Bock hast, egal ob for() oder while().
z.B.:
C:
for(i=0; i<20; i++; k++; j+=117; etc, etc)
 
Falls dich hier ein paar Warnungen des Compilers anlachen:

C:
    int i=0;
    int j=0;
    int k=0;
    int m=0;
    int count=0;

    for(i=1,j=5,k=24,m=43;  i<=20,j<=20,k<=39, m<=58;  i++,j++,k++,m++)

ändere es ab auf:
C:
    int i     =  1;
    int j     =  5;
    int k     = 24;
    int m     = 43;
    int count =  0;

    for( ;  i<=20 ;  i++, j++, k++, m++)

keine Mehrfachinitialisierungen (wurde oben sowieso schon gemacht), keine durch Komma getrennten Bedingungen (werden ignoriert).

Sollte es nötig sein, mehrere Bedingungen zu erfüllen, dann mit logischem Und/Oder verknüpfen,
z.B.:
C:
    for( ;  i<=20 && k<43 ;  i++, j++, k++, m++)

du brauchst für dein Beispiel nur eine Bedingung, denn es werden nicht mehr als 19 Zeilen verbunden, ergo können die anderen Werte gar nicht größer als gewünscht werden.
 
  • Gefällt mir
Reaktionen: makke306
Zurück
Oben