2017-06-14 5 views
0

Ich habe versucht, ein Array von 1.000.001 Element in C++ wie folgt zu initialisieren: int array[1000001]. Ich habe 4 GB RAM, so vermutete ich, das Problem ist, dass mein Laptop ein so großes Array wegen seiner Größe 4 * 1000001 bytes nicht halten kann. Also habe ich beschlossen, es zu char zu machen (nur weil ich wissen wollte, ob meine Vermutung richtig war). Ich lese das Array aus einer Datei. Dies ist mein Code:seltsames Array Lesen von Datei in C++

#include <iostream> 
#include <fstream> 
#include <climits> 

using namespace std; 


int main() 
{ 
    fstream in("C:\\Users\\HP\\Documents\\Visual Studio 2017\\Projects\\inputFile.in"); 
    if (!in) 
    { 
     cerr << "Can't open input file\n"; 
     return 1; 
    } 
    fstream out("outputFile.out", fstream::out); 
    if (!out) 
    { 
     cerr << "Can't open output file\n"; 
     return 1; 
    } 

    int n; 
    in >> n; 
    int i; 
    char array[100]; 
    for (i = 0; i < n; i++) 
     in >> array[i]; 

    in.close(); 
    out.close(); 
} 

Für die Eingabe:
5 45 5 4 3 12
mein Array ist {4, 5, 5, 4, 3}.

Für die Eingabe: 5 12 3 4 5 45
mein Array ist {1, 2, 3, 4, 5}

Jetzt bin ich wirklich verwirrt. Warum passiert dies?

+3

Warum lesen Sie Ganzzahlen in ein Char-Array? – NathanOliver

Antwort

4

In dieser Erklärung

in >> array[i]; 

wird es dem Bediener

template<class charT, class traits> 
basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>&, charT&); 

dem die Vorlage Parameter charT ersetzt ist Vorlagenart Argument char verwendet.

Der Operator liest ein Zeichen aus dem Stream, der Leerraumzeichen überspringt. So

als der Strom enthält die folgende Sequenz von Zeichen

45 5 4 3 12 

dann für die fünf Anrufe des Betreibers gibt es die folgenden Zeichen

4, 5, 5, 4, 3 

Leerzeichen gelesen werden, werden übersprungen.

Sie könnten den Stream als ganze Zahlen mit zum Beispiel wie

for (i = 0; i < n; i++) 
{ 
    int value; 
    in >> value; 
    array[i] = value; 
} 

Was das Problem mit der großen Integer-Array lesen, wenn Sie es als Unternehmen mit der statischen Lagerdauer zum Beispiel erklärt sie außerhalb jeder Funktion erklären. Oder Sie könnten die Standardklasse std::vector anstelle des Arrays verwenden.