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.

War es hilfreich?

Lösung

Wenn nur "echte" Dateien (nicht streamen, Geräte, ...) verwendet werden, können Sie stat / fstat oder so etwas wie

verwenden
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 mit realloc 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top