2016-03-23 13 views
1

Öğrencilerin veritabanına benzeyen bir kolej projesinin ortasındayım. metin dosyasının Her satır bu "modeli" şu:C++: getline işlevi olmayan dizgilerle beyaz boşluklu cin

age ; full_name ; avg 

Ben metin dosyasını okumak ve yapılar bir vektör her şeyi saklamak gerekiyor ve bu ismi olsaydı yalnızca bir kelime yapabilirdi. Açıkçası, yaş bir int, avg bir çift, ama tam adı ne olacak? file >> full_name;'u kullanamıyorum, tam_adı bir dizedir, çünkü bir boşluk içine girdiğinde okumayı durduracaktır. getline() işlevi her şeyi tek bir yerde saklayacaktır, bu yüzden ne yapacağımı bilmiyorum.

bu genç zihni x ile knowlegde) paylaşın

+0

[Ağır ilgili] (http://stackoverflow.com/questions/23047052/why-does-reading-a-record-struct-fields:

bir başlangıç ​​noktası olarak kod kod parçasını göz önünde uçtan uca entegre-stdistream-fail-ve-how-can-ı-fi). –

+1

' std :: getline', özel bir sınırlayıcı kullanabilir, '' 'kullanışlı gelebilir gibi görünebilir :) – melak47

+0

Gerçekten de benzer bir problem. Ama çözümün ne olduğunu anlamadım. Bir isimden fazla bir string kullanmak istemiyorum çünkü değişken bir kelime miktarına sahip olabilir. Ayrıca, dosyayı yeniden düzenlemek bir seçenek değildir. –

cevap

1

Diğerleri bir sınırlayıcı kadar karakter okumak için std::getline kullanabilirsiniz işaret etti.

int age; 
std::string name; 
double average; 

// ... Open the file which stores the data ... 

// then read every line. The loop stops if some of the reading operations fails 
while (input >> age && 
     std::getline(input, name, ';') &&  // consume the first ; 
     std::getline(input, name, ';') &&  // read the name 
     input >> average) { 
    // do whatever you need with the data read 
    cout << "age: " << age << " name: " << name << " average: " << average << '\n'; 
}