2010-04-05 13 views
6

Yalnızca içeriklerin 123 numaralı satırı olan num.txt adlı bir metin dosyası var.C++ Newbie: Veri okumak için bir işlev için bir fstream geçiriliyor

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

çıkışı:

First Time: 123 
Second Time: 3355185 

nasıl hala ana değişkeni atamak bir işlevde olduğu belirlenen bir fstream almak için beni anlamaya yardımcı olabilir Sonra şu var? Bunu yapıyorum çünkü alt_reader gerçekten çok daha fazlası var, ama bu benim takılı olduğum kısım. Yardım için çok teşekkürler.

GÜNCELLEME: Bill Oneal adlı kullanma , ben

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 
} 

Teşekkür yazdım. Şimdi orada olanlarla ilgili herhangi bir eleştiri var mı?

cevap

7

Değişkeni ilk kez yazdırdığınızda, dosyayı bir metin dosyası olarak yazdırmaya (10) yazdırdı (Ve çökmediğiniz için şanslısınız demektir). Yazdırdığınız ikinci kez, bir int olarak yeniden yorumlayarak, temsili tamamen farklı hale getirdiniz.

İşaretçiler bir türden başka bir türe döktüğünüzde, genellikle tanımlanmamış davranışları çağırırsınız. char'un int ile hiçbir standart ilişkisi olmadığından, buraya sahip olursunuz.

DÜZENLEME: Burada en az iki sorun var

#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

Teşekkürler. Bir fstream geçirme ve okuma değerini fonksiyondan çıkarma konusunda herhangi bir öneri (dönüş bildirimi olmadan)? – physicsmichael

+0

@ vgm64: Elbette. Düzenleme konusuna bakın. –

+0

@Bill ONeal: Kodumu tekniğinizle genişletme girişiminde bulundum. İşe yarıyor. Bunun hakkında ne düşünüyorsun? – physicsmichael

2

: Yorumunuz soruya cevap vermek. Sen alt_reader içine bir dize tampon geçen edilmelidir

  1. , yerine bir int geçiyoruz: Ana() in

    .

  2. '123' dizesini okumak istediğiniz, ancak int dosyasının 123 değerini almasını istediğiniz görülüyor.

Sen yapabilirdi: Ben alt_reader ve atoi için int dizesinden dönüştürme (bir scii) line[3]=0; yapar ekledik

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

Not.

+0

@quamrana: Bu, anlattığım durum için mükemmel çalışırdı, ama okuyacağım sayı mutlaka bir int ve Aşağıdaki dize akışı mutlulukla int veya double olacaktır. Öyle bile olsa, çok teşekkürler. – physicsmichael

İlgili konular