Domanda

Ho un file di testo denominato num.txt il cui unico contenuto è la linea 123. Poi ho il seguente:

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

L'output è:

First Time: 123
Second Time: 3355185

Potete aiutarmi a capire come ottenere un fstream che si legge in una funzione ancora assegnare la variabile in main? Sto facendo questo perché alt_reader ha davvero molto di più ad esso, ma questa è la parte che mi sono bloccato su. Grazie mille per l'aiuto.

UPDATE: Utilizzando i commenti di Bill Oneal, ho scritto

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
}

Grazie. Eventuali critiche con quello che c'è ora?

È stato utile?

Soluzione

La prima volta che è stata stampata la variabile, è stampato come un char *, la stampa di trattare il file come un file di testo (E sei fortunato tu non arresto). La seconda volta stampata, è reinterpretato come un int, rendendo la rappresentazione completamente diversa.

Ogni volta che si lanci puntatori da un tipo a un altro tipo si sono di solito invocando un comportamento indefinito. Dal momento che non ha alcuna relazione char standard per int, lo avete qui.

EDIT: Per rispondere alla tua domanda commento:

#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"
}

Altri suggerimenti

Hai almeno due problemi qui.

In main ():

  1. Si dovrebbe essere passa un buffer di stringa in alt_reader, invece si sta passando un int.
  2. sembrano voler leggere il '123' stringa, ma vuole un int per avere il valore di 123.

Si potrebbe fare:

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

Si noti che ho aggiunto al line[3]=0; alt_reader e atoi fa la conversione da stringa ( a SCII) per int.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top