2010-04-05 10 views
6

Ich habe eine Textdatei mit dem Namen num.txt Wer ist nur Inhalt ist die Zeile 123. Dann habe ich die folgenden:C++ Neuling: Übergabe eines fstream an eine Funktion zum Lesen von Daten

void alt_reader(ifstream &file, char* line){ 
    file.read(line, 3); 
    cout << "First Time: " << line << endl; 
} 

int main() { 
    ifstream inFile; 
    int num; 
    inFile.open("num.txt"); 
    alt_reader(inFile, (char*)&num); 
    cout << "Second Time: " << num << endl; 
} 

Die Ausgabe lautet:

First Time: 123 
Second Time: 3355185 

Können Sie mir helfen, herauszufinden, wie ein fstream zu erhalten, die in einer Funktion gelesen wird, noch die Variable im Haupt zuweisen? Ich mache das, weil alt_reader wirklich viel mehr hat, aber das ist der Teil, auf dem ich feststecke. Vielen Dank für die Hilfe.

UPDATE: Bill Oneal Kommentare verwenden, ich habe

geschrieben
void alt_reader(ifstream &file, stringstream &str, int n){ 
    char buffer[n+1]; 
    file.read(buffer, n); 
    buffer[n] = 0; 
    str << buffer; 
    cout << "First Time: " << buffer << endl; //First Time: 123 
} 

int main() { 
    ifstream inFile; 
    stringstream strm; 
    int num; 
    inFile.open("num.txt"); 
    alt_reader(inFile, strm, 3); 
    cout << "Second Time: " << num << endl; //Second Time: 123 
} 

Dank. Irgendwelche Kritiken mit dem, was ist jetzt da?

Antwort

7

Das erste Mal, als Sie die Variable druckten, druckten Sie sie als char *, Drucken Behandlung der Datei als Textdatei (Und Sie haben Glück, dass Sie nicht abgestürzt sind). Das zweite Mal, als Sie es ausgedruckt haben, haben Sie es als int interpretiert, was die Darstellung völlig anders macht.

Wenn Sie Zeiger von einem Typ auf einen anderen Typ umwandeln, rufen Sie normalerweise undefiniertes Verhalten auf. Seit char hat keine Standardbeziehung zu int, Sie haben es hier.

EDIT: Ihr Kommentar Frage zu beantworten:

#include <sstream> 

void foo(std::stream &str) { 
str << "42\n"; 
}; 

int main() { 
int aNumber; 
std::stringstream aStringStream; 
foo(aStringStream); //Pass our stream to the function. It contains 
    //"42\n" when the function returns. 
aStringStream >> aNumber; //aNumber == 42 
aNumber += 10; //aNumber == 52; 
std::cout << aNumber; //Print "52" 
} 
+0

Danke. Irgendwelche Ratschläge zum Übergeben eines fstream und zum Abrufen des gelesenen Wertes aus der Funktion (ohne eine Rücksendeanweisung?)? – physicsmichael

+0

@ vgm64: Sicher. Siehe Bearbeiten. –

+0

@Bill ONeal: Ich habe gerade einen Versuch hinzugefügt, meinen Code mit Ihrer Technik zu erweitern. Es klappt. Was denkst du darüber? – physicsmichael

2

Sie haben mindestens zwei Probleme hier.

In main():

  1. Sie sollten einen String-Puffer in alt_reader werden vorbei, stattdessen sind Sie ein int übergeben.
  2. Sie scheinen die Zeichenfolge '123' lesen zu wollen, möchten aber, dass ein int den Wert 123 hat.

Sie könnten tun:

void alt_reader(ifstream &file, char* line){ 
    file.read(line, 3); 
    line[3]=0; 
    cout << "First Time: " << line << endl; 
} 

int main() { 
    ifstream inFile; 
    inFile.open("num.txt"); 

    char buffer[128]; 
    alt_reader(inFile, buffer); 

    int num=atoi(buffer); 
    cout << "Second Time: " << num << endl; 

    return 0; 
} 

Bitte beachte, dass ich line[3]=0; zu alt_reader und atoi führt die Konvertierung von string (ein scii) in int hinzugefügt haben.

+0

@quamrana: Das würde perfekt für die Situation funktionieren, die ich beschrieben habe, aber die Zahl, die ich lesen werde, ist nicht unbedingt ein int, und die String-Stream unten wird glücklich in ein int oder double gehen. Trotzdem, vielen Dank. – physicsmichael