2012-03-28 6 views
0

Ich habe eine Datei mit einer großen Anzahl von Zahlen, jede Zahl ist durch ein Leerzeichen getrennt.Suchen Sie schnell einen Speicherort in einer Datei

Solche wie: 124 1212 5 654 74231 ...

Wie kann ich schnell die n-te Zahl in dieser Datei suchen?

denke ich fseek() kann nicht funktionieren, da es durch Bytes gemessen ist, und ich kann durch die N-te Nummer erhalten:

int i; 
for (i=0;i!=N-1;++i) fscanf(somefile,"%d",&variable); 

Aber ich denke, es könnte eine Möglichkeit, effizienter sein?

+1

Sobald Sie eine Stelle in der Datei mit fscanf und dergleichen gefunden haben, können Sie verwenden ftell(), um die Byte-Position des Dateizeigers zu erhalten, die Sie fseek passieren können zurückkehren dieser Ort ziemlich sofort. –

+0

@MarcB Leider muss ich nicht zu einer Nummer zurückkehren, die ich gerade gefunden habe. Ich kann zurückgehen, nachdem ich Hunderttausende anderer Nummern gefunden habe. – goofy

+0

Wenn die in der Datei gespeicherten Zahlen keine Eigenschaft besitzen (z. B. sind sie alle 3 Ziffern lang), ist die einzige Möglichkeit, die gesamte Datei zu lesen, bis Sie die N-te Ganzzahl erreichen. – mfontanini

Antwort

1

Wenn Sie die Datei erstellen, dann zwei weitere Optionen sind:

  1. Druck jede Zahl in einer festen Breite Feld sufficie nur weit, um die größte Anzahl zu halten (z.B. „% 5d“), dann fseek(somefile,(N-1)*6,SEEK_SET) Nummer N. positionieren

  2. Wenn die Datei muss nicht menschlich lesbar sein, können Sie die ganzen Zahlen als binäre Daten anstelle von ASCII-Zeichen in die Datei fwrite() konnte und greifen Sie mit

    fseek(somefile,(N-1)*sizeof(int),SEEK_SET) 
    fread(&variable,sizeof(int),1,somefile) 
    
4

Lesen Sie die gesamte Datei einmal und erstellen Sie einen Index für einige Datenpunkte in der Datei (z. B. 1000 Punkte). Jeder Eintrag im Index kann den Speicherort in der Datei der N-ten Nummer zuordnen, die an diesem Speicherort beginnt. Nachdem Sie diesen Index erstellt haben, finden Sie bei jeder Suche nach der N-ten Nummer zuerst den nächsten Eintrag im Index, der Ihnen den nächsten bekannten Punkt in der Datei angibt, den Sie fseek anfügen können. Führen Sie dann Ihre Suche mit fscanf durch, um den Wert zu finden. Dies reduziert die Suchzeit um den Preis der Verwendung von etwas Speicher für den Index.

ein Eintrag in dem Index kann wie folgt aussehen: (Datei-Offset, die Anzahl N)

Index kann wie folgt aussehen: (Datei-Offset 1, Nummer 1) (Dateioffset 2, Nummer 2) . .. (Datei-Offset N, die Anzahl N)

Verwandte Themen