datei in gleich große stückchen teilen
-
Ich würde gern eine Datei her nehmen (den namen übergebe ich per argv[1]),
sie binär öffnen und in jeweils n 1024Bit blöcken in anderen dateien speichern.
(n wird als argv[2] übergeben).Beispiel: Es wird „myfile.txt“ und „8“ übergeben. Ihr Programm stellt
fest, dass die Ausgangsdatei myfile.txt genau 36800 Bytes groß ist. Dann soll das Programm fünf Dateien
myfile.txt.1 bis myfile.txt.5 erzeugen. Die ersten vier sollen dabei 8192 Bytes, die letzte 4032 Bytes umfassensoweit bin ich bisher, weiss aber nicht weiter:
[code]
#include <stdio.h>
#include <stdlib.h>
#define BUFFERSIZE 1024int getsize(char* source)
{
FILE* fp = fopen(source,"rb");
fseek(fp,0,SEEK_END);
long length = ftell(fp);
fclose(fp);
return length;
}
int dividefiles(char* infile, int number)
{char* buffer;
unsigned int i,j;
unsigned int bytestoread = BUFFERSIZE * number; //Blockweise einlesen
unsigned int bytesread = 0;
int filesize = getsize(infile);
unsigned int count = (filesize/(BUFFERSIZE * number))+1; // Anzahl der Files, die geschrieben werden müssen
char outfile[count-1];
printf("File dividing:\nFilesize: %i\nBytes per file: %i\nNumber of Files: %i\nBytes at last file: %i",filesize,bytestoread,count,filesize %bytestoread );
if (bytestoread > filesize)
{
fprintf(stderr,"Die angegeben Datei ist zu klein um sie in %i Bloecken a 1024 Bits zu lesen.",number);
}
FILE* in = fopen(infile,"rb");
FILE* out = fopen(outfile,"wb");
for(i = 1; i <= count; i++)
{
sprintf(outfile[i],"%s.%i",infile,i);if(filesize - bytesread < BUFFERSIZE * number) //falls nicht mehr genügend zeichen in datei
bytestoread = filesize - bytesread;
else
bytestoread = BUFFERSIZE * number; //normaler zu lesender blockif (bytestoread > 0) //solange es noch zeichen zu lesen gibt
{
fread(buffer,bytestoread,1,in);
fwrite(buffer,bytestoread,1,outfile[i]);
bytesread += bytestoread;
}
}
//flcose(out);
//fclose(in);
}int main(int argc,char **argv)
{
dividefiles(argv[1],atoi(argv[2]));getch();
return 0;
}[code]kann mir da jmd weiter helfen?! ich bekomme zB einen laufzeitfehler, wenn ich die dateinamen anlegen möchte?!
-
deine Variable "outfile" hat wohl die falsche Größe.
Warum initialisierst du sie als Array mit der Anzahl der anzulegenden Dateien?
Das Array sollte eher die Größe von "infile" + "." + "Zahl" haben ...
Bei
sprintf(outfile[i],"%s.%i",infile,i);
willst du in ein char element ein ganzen String schreiben ...
-
Hallo petedeluxe,
du hast in deinem Code ein paar Fehler eingebaut, die ich hier nicht alle
aufzählen werde:1. Ansi C erfordert (bis C98), dass Variablen zu Beginn einer Funktion,
genauer gesagt zu Beginn eines Scopes, deklariert sind. Dies ist z.B. hier
nicht der Fall:if (bytestoread > filesize) { fprintf(stderr,"Die angegeben Datei ist zu klein um sie in %i Bloecken a 1024 Bits zu lesen.",number); } FILE* in = fopen(infile,"rb"); // <- zu spät!
2. Ebenfalls muß beim Kompilieren feststehen, wie groß ein Array ist.
Dies ist genau hier nicht der Fall: (bis C98)char outfile[count-1]; // <- count wird kurz vorher berechnet!
3. Die zuletzt zitierte Zeile legt dir ein Array von Chars und nicht
ein Array von Strings an, wie du es in der folgenden Zeile verwendest:sprintf(outfile[i],"%s.%i",infile,i);
outfile[i] ist vom Typ: char
sprintf erwartet an dieser Stelle: char*4. In der folgenden Zeile möchtest du eine Datei zum Schreiben öffnen,
hast aber vergessen, outfile zu füllen. Dies kann nicht funktionieren:FILE* out = fopen(outfile,"wb");
Ich habe deinen Code mal bereinigt. Viel Spaß damit.
#include <stdio.h> #include <stdlib.h> #define BUFFERSIZE 1024 int getsize(char* source) { FILE* fp = fopen(source,"rb"); int length; fseek(fp,0,SEEK_END); length = ftell(fp); fclose(fp); return length; } void dividefiles(char* infile, int number) { unsigned int i,j; unsigned int bytestoread = BUFFERSIZE * number; unsigned int filesize = getsize(infile); unsigned int count = (filesize/(BUFFERSIZE * number))+1; FILE* in = fopen(infile,"rb"); printf("File dividing: %s\n", infile); printf("Filesize: %i\n", filesize); printf("Bytes per file: %i\n", bytestoread); printf("Number of Files: %i\n", count); printf("Bytes at last file: %i\n", filesize %bytestoread ); if (bytestoread > filesize) { fprintf(stderr,"Die angegeben Datei ist zu klein, um sie in %i Bloecken a 1024 Bytes zu lesen.", number); } for(i = 0; i < count; ++i) { char filename[1024]; char buffer[BUFFERSIZE]; FILE *out; sprintf(filename, "%s.%03i", infile, i); out = fopen(filename, "wb"); for (j=0; j<number; ++j) { size_t len = fread(buffer, 1, BUFFERSIZE, in); if (fwrite(buffer, 1, len, out) != len) { printf("(E) Fehler beim Schreiben!\n"); exit(0); } if (len != BUFFERSIZE) break; } fclose(out); } } int main(int argc,char **argv) { if (argc != 3) { printf("Usage: %s <filename> <number>\n", argv[0]); return -1; } dividefiles(argv[1],atoi(argv[2])); getchar(); return 0; }
Gruß mcr
PS: das erste Element eines Array hat die Nummer 0 und nicht 1!
Die for-Schleife oder die Verwendung der Variablen i bei dir ist auch falsch:char outfile[count-1]; // <- warum -1? ... for(i = 1; i <= count; i++) { sprintf(outfile[i],"%s.%i",infile,i); // <- outfile[count] gibt es nicht!
-
wow, ich bin beeindruckt, wie fix das hier geht.
vielen dank für die schnelle hilfe!
ja da waren einige fehler drin...
mein größtes problem war, dass ich nicht genau wusste, wie ich die dateinamen unterschiedlich anlegen soll...
mit 2 for schleife sieht das schon ganz gut aus... auch, dass man die blöcke einzelnd in einer forschleife einliest finde ich gut.
nur bei der benutzung von "%03i" blick ich noch nicht ganz durch?!
habe das bisher nur mit %typ gekannt
-
Hallo,
%d
gibt an, dass eine Integerzahl ausgegeben werden soll.
%3d
gibt an, dass eine Integerzahl ausgegeben und dafür
mindestens 3 Zeichen Platz gelassen werden soll.%03d
gibt an, dass eine Integerzahl ausgegeben werden soll,
und sollte die Zahl weniger als 3 Zeichen groß sein, werden Nullen
vorweg geschrieben.Hier mal ein Beispiel:
i=4; printf("%d\n", i); // liefert: "4" printf("%3d\n", i); // liefert: " 4" pritnf("%03d\n", i); // liefert: "004"
Ab i=100 liefern alle drei printfs "100" (z.B.) so auch für mehr als
dreistellige Zahlen wie 9876.Gruß mcr
-
Hallo mich würde mal interessieren, ob es möglich ist eine große zahl aus einer Textdatei zu lesen und so zu zerschneiden, dass die Zahl in mehreren 16-Bit short Feldern eines Arrays abgelegt wird.
das problem dabei ist ja:
habe ich z.b. die Zahl 851967 in einer datei
binär also 11001111111111111111, nun um mit den teilen weiter rechnen zu koönnen müsste ich sie zerschneiden in 1100 = 12 und 1111111111111111 = 65535wenn ich also eine zahl in mehrer felder eines Arrays ablegen will, reicht es also nicht die zahl (bsp. oben 851967 zerschneiden in 12 und 65535) zu zerschneiden sondern ich muss die einzelnen bits zerlgen..
weiss jemand wie ich das mache, finde keinen ansatz