2012-03-27 5 views
1

Ich habe eine * .txt-Dateien mit Ganzzahlen, eine auf jeder Zeile. So würde die Datei so etwas wie aussehenLesen von Zahlen aus einer * .txt-Datei in C++ mit fstream

103123 
324 
4235345 
23423 
235346 
2343455 
234 
2 
2432 

Ich versuche, diese Werte aus einer Datei Zeile für Zeile zu lesen, damit ich sie in einem Array setzen kann. Unten ist ein Code, den ich schrieb, um das zu erreichen:

Die Datei wird geöffnet, da das Bool 'B' True zurückgibt. Die While-Schleife wird jedoch in einem Durchgang beendet. und das Array ist leer. Ich schaute Online auf und versuchte, andere Dinge wie die Code hier gegeben bei

code tutorial

#include "stdafx.h" 
#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int nArray[100000]; 
int i = 0; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    ifstream in("C:\Users\Chinmay\Documents\Array.txt"); 
    bool b = in.is_open(); 

    if(!in) { 
    cout << "Cannot open input file.\n"; 
    return 1; 
    } 

    char str[255]; 

    while(in) { 
    in.getline(str, 255); // delim defaults to '\n' 
    if(in) cout << str << endl; 
    } 

    in.close(); 

    return 0; 

} 

Dies sofort auch zurückgibt. Die Datei wird geöffnet, aber es werden keine Daten gelesen. Die Datei ist nicht leer und enthält die Daten. Kann mir jemand erklären, wo ich falsch liege? Ich verwende die Betaversion von Visual Studio 2011.

+2

Warum Sie nicht verwenden 'int tmp; cin >> tmp' und speichern Sie das Ergebnis in einer 'std :: vector' oder' std :: list'? –

+2

'std :: vector ' ist dein Freund, in der Tat. 'int nArray [100000];' könnte sehr speicherverschwendend sein. –

+0

Ich stimme der Verwendung von std :: vector zu, anstatt das Array auf dem Stapel zuzuweisen. Dies war nur ein erster Entwurf und ich habe nur versucht, den Teil "Lesen aus Datei" richtig zu machen. Ich werde auch versuchen mit dem, was Niklas B. vorgeschlagen hat.Immer noch neugierig, warum die fstream und fstream.getline() nicht funktioniert haben. Vielen Dank. –

Antwort

2

Dies ist nicht das, was Sie denken, es tut:

ifstream file("C:\Users\Chinmay\Documents\Array.txt"); 

verwenden Schrägstriche (auch unter Windows) und überprüfen Sie die geöffnete Datei gelang es sofort:

std::ifstream ifs("C:/Users/Chinmay/Documents/Array.txt"); 
if (!ifs) 
{ 
    // Failed to open file. Handle this here. 
} 
-1

Dies ist ein schönes Stück Code http://www.java2s.com/Code/Cpp/File/readingatextfile.htm
Wenn dies auf Ihre Datei funktioniert, dann fügen Sie einfach Ihre Zuordnung

nArray [i ++] = atoi (Linie); nach dem Cout.


Wenn es immer noch funktioniert .. dann kommentieren Sie den Cout .. Könnte gut sein, lassen Sie es dort kommentiert, wie es Ihrem Lehrer Ihren Prozess zeigen könnte. Einige Profis wollen nur das fertige Produkt sehen, das liegt also an dir

+0

Oh .. seien Sie sicher und setzen Sie i auf Null, bevor Sie die While-Schleife starten. – baash05

+1

Dieser Code ist schrecklich. [Es behandelt fälschlicherweise EOF.] (Http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-sidered-wrong) – Blastfurnace

+0

@Blastfurnace total sehen es jetzt .. lesen Sie in der Weile() und es wäre gut. – baash05

0

Ich sehe nicht viel falsch mit der zweiten Version. In der ersten Version rufen Sie file.getline(str,7);, wo die Zeile manchmal eine 7-stellige Nummer enthält. Dies wird so lange gelesen, bis das Trennzeichen (Standard '\n') erreicht wird oder bis 6 Zeichen gelesen wurden. In diesem Fall wird failbit gesetzt.

Da Sie nur für eof in der while Schleife testen, wird es nicht beendet.

Wenn Sie die 7 in eine 8 in der getline Anruf und die char Array-Deklaration in der Zeile oben ändern, sollte es funktionieren.

Alles in allem ist @ Niklas Bs Vorschlag, int tmp; file >> tmp; zu verwenden und in einer vector zu speichern, wahrscheinlich die einfachste Lösung.

Verwandte Themen