Lesen einer Datei auf char-Array dann malloc Größe. (C)
-
26-09-2019 - |
Frage
Hey, kann so sagen, dass ich eine Datei als erstes Befehlszeilenargument erhalten.
int main(int argc, char** argv) {
unsigned char* fileArray;
FILE* file1 = fopen(argv[1], "r");
}
Nun, wie kann ich mich über diese Datei, char von char lesen, in die char* fileArray
?
Im Grunde genommen, wie kann ich eine FILE*
zu einem char*
konvertieren, bevor ich, wie groß ich brauche kenne die char*
malloc
Ich weiß, dass eine mögliche Lösung ist es, einen Puffer zu verwenden, aber mein Problem ist, ich mit Dateien zu tun habe, die 900.000 Zeichen haben über konnte, und sieht nicht, es einen Puffer fit zu machen, die so groß ist.
Lösung
Wenn nur "echte" Dateien (nicht streamen, Geräte, ...) verwendet werden, können Sie stat
/ fstat
oder so etwas wie
int retval=fseek(file1,0,SEEK_END); // succeeded if ==0 (file seekable, etc.)
long size=ftell(file1); // size==-1 would be error
rewind(file1);
, um die Größe der Datei zu erhalten vorher. Dann können Sie und lesen malloc. Aber da file1 könnte in der Zwischenzeit ändern müssen Sie noch sicherstellen, nicht über Ihre malloced Größe zu lesen.
Andere Tipps
Es gibt ein paar Ansätze, die Sie ergreifen können:
- eine maximale Größe angeben, dass Sie behandeln können, dann nur Sie zuweisen einmal (ob als globales oder auf dem Heap).
- Sie die Datei in Stücke handhaben, wenn Sie auf einmal Sorgen machen über alles in den Speicher passen.
- Griff eine beliebige Größe von
malloc
mitrealloc
mit (wie Sie Bits lesen).
Die Nummer 1 ist einfach:
static char buff[900001]; // or malloc/free of 900000
count = fread (buff, 1, 900001, fIn);
if (count > 900000) // problem!
Nummer 2 ist wahrscheinlich der beste Weg, es sei denn, Sie absolut Notwendigkeit zu tun, die gesamte Datei im Speicher auf einmal. Zum Beispiel, wenn Ihr Programm zählt die Anzahl der Wörter, kann es der Reihe nach die Datei ein paar K zu einer Zeit verarbeiten.
Number 3, können Sie eine buffer
, used
und max
Variable halten. Zunächst Satz max
auf 50K und zuteilen buffer
als dieser Größe.
Versuchen Sie dann in einem 10K Brocken auf einen festen Puffer tbuff
lesen. Fügen Sie den aktuellen used
und die Anzahl der gelesenen Bytes in tbuff
und, wenn das größer ist als max
, machen einen realloc
buffer
von einem anderen 50K (Einstellung max
zur gleichen Zeit) zu erhöhen.
Dann hängen Sie tbuff
zu buffer
, stellen used
, Spülen und wiederholen. Beachten Sie, dass alle diese Werte (10K, 50K und so weiter) sind nur Beispiele. Es gibt verschiedene Werte, die Sie nach Bedarf verwenden können, abhängig.