Hilfe gebraucht, dringend : Unterteilung von Datei in C

L

lord

Grünschnabel
Hallo,


Ich habe solche Aufgabe:

Gegeben seien 3 Dateien (txt-Dateien, erste hat 0,95 Mb, zweite auch 0,95 Mb und dritte 16 B)
Der Algorithmus unterteilt jede Datei in 16 gleiche Blöcke. Man darf voraussetzen, dass alle drei Dateien ohne Rest durch 16 teilbar sind. Zunächst wird ein Block eingelesen.

Meine Fragen:
1.Wie kann man unter C eine solche Datei in Blöcke teilen.
2. ...und wenn man schon diese Dateien unterteilt hat, wie kann man später im Programm auf diesen Blöcken zugreifen um weitere Operationen auf diesen Blöcken durchzuführen.

MfG.
 
ich versteh nicht ganz wie "in 16 teile aufteilen" sollen aus diesen dateien 16 gleich grosse dateien werden oder wie? oder wie stellst du dir die teilung vor?

mfg hazelnoot!
 
Vieleicht wenn du die ganze Datei in einen StrinArray einliest, dann die Arraygröße ermittelst und dann durch 16 Teilst und jeden Teil dann mit einer Schleife ausgibst.

Meine persöhnliche Frage: Sinn???


//EDIT:
Oder versuchsmal mit fgetf() da kannst du angeben, wieviel Zeichen er dann einliest.
 
Zuletzt bearbeitet:
Datei einlesen; String in Teile zerlegen, die jeweilst sizeof(string)/16 Zeichen lang sind und in Variablen oder einem Array ablegen. Zugriff wie ueblich auf Variablen oder Arrays. Sinn ist mir allerdings auch nicht klar.
 
Hallo,

Also noch ein mal: gegeben seien 3 Deteien, aber betrachten wir jetzt nur eine.

Es gibt Datei die 1000000 Bajts hat, in dieser Datei wurde die Zahlen eingeschrieben, also 1000000 Zahlen. Jetzt muß ich diese Datei in 16 gleiche Blöcke verteilen, also jeder Block hat nach Verteilung 62500 Bajts (Zahlen), und jetzt habe ich 16 gleiche Blocke mit jeweils 62500 Bajts.

Meine Frage:
1. Wie kann ich diese Datei auf 16 gleichen Blöcke teilen verteilen.
2. Wie kann ich später auf diese Datei zugreifen um weitere Operationen auf diesen Deteien durchzuführen.

Beispiele gern gesehen.

MfG

<Lord>
 
1. Kann mit deiner Erklärung hier keiner was anfangen.
WTF meinst du denn mit Blöcken?

2. Wurden dir oben schon erklärt was du machen musst.
 
Das ist meine ganze Aufgabe die ich lösen muß:

Gegeben seien drei Dateien(txt-Dateien, erste hat 0.95 Mb, zweite 0.95 Mb, und dritte hat 16 Bajts), für die eine Prüfsumme errechnet werden soll. Zu diesem Zweck soll ein eigens entwickelter Hash-Algorithmus eingesetzt werden.

Spezifikation

Der Algorithmus unterteilt jede Datei in 16 gleiche Blöcke. Sie dürfen voraussetzen, dass alle drei Dateien ohne Rest durch 16 teilbar sind. Zunächst wird ein Block eingelesen. Die Zeichen der eingelesenen Datei werden dabei als ASCII-Zeichen interpretiert. Das eingelesene Zeichen ‘A’ würde also als Wert 65 interpretiert usw. Anschließend werden alle ASCII-Werte addiert. Ein Block aus den ASCII-Zeichen {1, 2, 3, 4, 5} würde also das Ergebnis 1+2+3+4+5 = 15 erzeugen. Dieses Ergebnis ist aber noch mehrstellig. Erst wenn es einstellig ist, wurde der Hash-Wert für diesen Block fertig berechnet. Nun muss also 1+5 gerechnet werden (= 6). Beachten Sie, dass in diesem Schritt nicht mehr die ASCII-Werte zur Berechnung genutzt werden, sondern die tatsächlichen Zahlenwerte. Da diese Zahl nun nicht mehr mehrstellig ist, ist sie der Hash-Wert für diesen Block. Diese Prozedur wird nun für alle Blöcke wiederholt. Schlussendlich erhalten Sie also eine Liste aus 16 Ziffern. Dieser Ziffernblock stellt die Prüfsumme für die geprüfte Datei dar.

Ein Teil der Aufgabe hab ich schon gelöst, brauche aber jetzt ne hinweise.
Ich hab keine Ahnung wie ich diese Dateien in 16 gleiche Blöcke in C verteilen kann und wie später auf diesen Blöcke zugreifen kann.

MfG
lord
 
Ohje, wir sind doch hier keine Hausaufgabenhilfe. Wie willst du denn was lernen, wenn du dir alles vorsetzen laesst? Lass die graue Masse also einfach mal etwas brodeln. Loesungsansaetze wurden dir hier ausreichend geliefert.
 
Danke für Links,

aber wie ich schon gesagt habe ich will nicht damit jemand meine ganze aufgabe
löst, ein Teil dieser Aufagbe hab ich schon geloest, jetzt brauche ich nur die Hinweise wie ich die Datei in Blöcke verteilen kann.

Ich hab mich entschieden, hier mein Problem vorzustellen, weil ich wenig Zeit habe um meine Aufgabe zu lösen. Das bedeutet aber nicht dass ich meine Aufgabe nicht selbst aufzulösen versuche.

MfG
 
Warum soll ich das zeigen, ist das ne Prüfung oder was.
Wenn Du mir Helfen willst oder kannst, einfach schreib nichts.
Außerdem wenn ich wollte damit jemand mir diese ganze Aufgabe auflöst, würde ich einfach darum gebetten.
Ich brachu nur eine Hinweise (steht oben) und nichts mehr.
 
Hallo
Ich denke, dass du die Aufgabe nicht richtig verstanden hast.
Stoß dich doch nicht an dem Begriff Block. Der wird hier doch nur verwendet, um den Prüfsummenalgorithmus zu definieren. Das meint nur, wieviele Daten für die Berechnung einer der 16 Ziffern der Prüfsumme verwendet werden sollen.
Also ist dir damit vorgegeben, wie lang dein String sein soll.
Wie du programmtechnisch deine Stringlänge bastelst, ist dir selbst überlassen. Das geht über Array, oder Stringlänge oder eigene Typendefinition oder...
Block ist also nix weiter als eine Datenmenge in Byte, die du häppchenweise zu Verarbeitung heranziehst.
:headup:

Gruß Wolfgang
 
Warum soll ich das zeigen, ist das ne Prüfung oder was.

Du hast da was falsch verstanden.

Es geht darum das du uns zeigst was du bisher gemacht, und wir dann kucken wo es hakt.

Das mit dem "zeig mal was du gemacht hast" war also mehr oder weniger nett gemeint.
 
Du legst 16 Behaelter an, in die Du Deine Dateitypen speichern willst, an. Unter C++ z.B. 'std::vector<int> behaelter[16]'
Dann liest Du die Daten der Reihe nach ein. Entweder, Du zaehlst zuerst, wieviele Daten in der Datei sind, teilst das durch 16 und fuellst dann einen Behaelter nach dem anderen. Oder Du laesst z.B. einen Zaehler mitlaufen und machst dann sowas wie
'my_input >> behaelter[counter%16];'
Ist wahrscheinlich nicht das schnellst, doch bei 10^6 Zahlen wird das nicht lange dauern.
 
also so koenntest du eventl die bloecke aufsplitten:
(ps nicht getestet aber es is mal ein vorschlag:)
Code:
/*generates the hash code from a file*/

#include <stdio.h>
#include <sys/stat.h>
#include <stdlib.h>

#define FILENAME "/home/badbackslash/C/LinuxUnixHacking/HASH/test.test"
#define BLOCKNUM 16


/*get the size of the file*/
int getFileSize(char *filename){
    struct stat sizeStruct;
    
    if( stat(filename, &sizeStruct) == -1){
        return -1;
    }else{
        return sizeStruct.st_size;
    }
}


int main(void){
    /*size vars*/
    int fileSize;
    int blockSize;

    /*runvar*/
    int i;

    /*the blocks*/
    char **blocks;

    /*etc*/
    char bufferChar;
    int aktBlock;
    
    /*read the file*/
    FILE *input = fopen(FILENAME, "r");
    
    /*check if the file is open*/
    if(input == NULL){
        printf("konnte file nicht oeffnen!\n");
        return -1;
    }

    /*get the size of the file*/
    fileSize = getFileSize(FILENAME);
    
    /*get the size for one block*/
    blockSize = fileSize / BLOCKNUM;

    /*allocate the space for the 16 blocks*/
    blocks = (char **)malloc(BLOCKNUM * sizeof(char *));

    /*allocate the space for one block and addit to the mainblockspace*/
    for(i = 0; i < BLOCKNUM; i++){
        blocks[i] = (char *)malloc(blockSize * sizeof(char));
    }

    /*read the file and write it to the array*/
    i = 0;
    aktBlock = 0;
    while( (bufferChar=fgetc(input)) != EOF){
        /*ad the buffer char to the aktBlock at the aktPosition*/
        blocks[aktBlock][i] = bufferChar;
        
        /*aktualize the aktBlock var*/
        if(i == blockSize){
            printf("%d\n", aktBlock);
            aktBlock++;
            i = 0;
        }
        if(aktBlock == BLOCKNUM){
            break;
        }
        i++;
    }
    
    /*create the has code for every container!!!*/

    /* free the allocated space */
    for(i = 0; i < BLOCKNUM; i++)
        free(blocks[i]);
   
    free(blocks);

    /*close the file*/
    fclose(input);
}/*end main*/

so und hier nochmal das ganze programm: http://hazelnoot.ha.funpic.de/hash.c /*weis aber nicht obs wirklich funkt sieht aber ganz gut aus*/
 
Zuletzt bearbeitet:
Habt ihr dem Jungen schoen seine Hausaufgaben gemacht. ;)
 
theton schrieb:
Habt ihr dem Jungen schoen seine Hausaufgaben gemacht. ;)

Den Schuh zieh ich mir nicht an.
:oldman
Ich habe ja lediglich die Aufgabe nochmal erklärt. ;)
Naja, wenn er wirklich schon eine Teillösung hatte, wird er ja vieleicht doch seine eigene Leistung hier posten.
Sonst ist der Lerneffekt gegen Nul. Die nächste Aufgabe kommt bestimmt, und dann wird sich zeigen wie es mit den eigenen erarbeiteten Grundlagen steht.

Gruß Wolfgang
 
theton schrieb:
Habt ihr dem Jungen schoen seine Hausaufgaben gemacht. ;)
hmm tja mir macht das coden spass und so eine aufgabe is was auf ne viertel stunde und intressiert hats mich auch... warum den code dann nicht posten?(was nicht heisst das der code 100% funkt)
 
hazelnoot schrieb:
hmm tja mir macht das coden spass und so eine aufgabe is was auf ne viertel stunde und intressiert hats mich auch... warum den code dann nicht posten?(was nicht heisst das der code 100% funkt)

Kann das ja verstehen. Mir macht das Coden ja auch Spass (wenn auch leider immer weniger Zeit dafuer bleibt), aber ich weiss, dass ich's nicht gelernt haette, wenn ich mir bei jedem kleinen Problem alles vor die Nase haette setzen lassen.
 
er muss es ja nicht abschaun er kanns ja auch nur zum ueberpruefen nutzen
 
Zurück
Oben