2010-04-05 9 views
6

J'ai un fichier texte nommé num.txt dont le seul contenu est la ligne 123. Ensuite, je donne les résultats suivants:Débutant C++: Passage d'un fstream à une fonction pour lire les données

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; 
} 

La sortie est:

First Time: 123 
Second Time: 3355185 

Pouvez-vous me aider à comprendre comment obtenir un fstream qui est lu dans une fonction affecter encore la variable principale? Je le fais parce que alt_reader en a vraiment beaucoup plus, mais c'est la partie sur laquelle je suis bloqué. Merci beaucoup pour l'aide.

MISE À JOUR: Utilisation des commentaires de Bill Oneal, j'ai écrit

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 
} 

Merci. Des critiques avec ce qu'il y a maintenant?

Répondre

7

La première fois que vous avez imprimé la variable, vous l'avez imprimée comme char *, en imprimant le fichier comme un fichier texte (et vous êtes chanceux que vous ne vous soyez pas écrasé). La deuxième fois que vous l'avez imprimé, vous l'avez réinterprété comme un int, rendant la représentation complètement différente.

Chaque fois que vous lancez des pointeurs d'un type vers un autre type, vous invoquez généralement un comportement non défini. Depuis char n'a pas de relation standard à int, vous l'avez ici.

EDIT: Pour répondre à votre question de commentaire:

#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

Merci. Un conseil sur le passage d'un fstream et obtenir la valeur de lecture hors de la fonction (sans déclaration de retour?)? – physicsmichael

+0

@ vgm64: Bien sûr. Voir éditer. –

+0

@Bill ONeal: Je viens d'ajouter une tentative d'expansion de mon code avec votre technique. Ça marche. Qu'en pensez-vous? – physicsmichael

2

Vous avez au moins deux problèmes ici.

En main():

  1. Vous devriez passer un tampon de chaîne en alt_reader, au lieu vous passez un int.
  2. Vous semblez vouloir lire la chaîne '123' mais vous voulez qu'un int ait la valeur 123.

Vous pouvez faire:

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; 
} 

Notez que j'ai ajouté line[3]=0; à alt_reader et atoi effectue la conversion de la chaîne (un SCII) int.

+0

@quamrana: Cela fonctionnerait parfaitement pour la situation que j'ai décrite, mais le nombre que je vais lire n'est pas nécessairement un int, et le flux de chaîne ci-dessous va heureusement aller dans un int ou double. Même ainsi, merci beaucoup. – physicsmichael