2010-10-11 16 views
19

Bir txt dosya satırını satır satır okumak istiyorum ve her satırı okuduktan sonra satırı "\ t" sekmesine göre bölmek ve her parçayı eklemek istiyorum bir yapıdaki bir öğeye.C++ Dosya satırını satır satır okuma ve sınırlayıcıyı kullanarak her satırı bölme

benim yapı 1 * Char ve 2 * int

chr birden fazla karakter içerebilir
struct myStruct 
{ 
    char chr; 
    int v1; 
    int v2; 
} 

.

bir çizgi olması gereken bir şey gibi:

randomstring TAB number TAB number NL 
+7

Bir char, birden fazla karakter içeremez, muhtemelen char * anlamına gelir, ayrıca v1 ve 2'nin amacı bana tamamen açık değildir. – flownt

+0

@flownt: evet benim hatam. – sikas

+4

Peki, seni durduran nedir? –

cevap

24

Dene:
Not: chr 1'den fazla karakter içerebilir eğer o temsil edecek bir dize kullanabilirsiniz.

std::ifstream file("plop"); 
std::string line; 

while(std::getline(file, line)) 
{ 
    std::stringstream linestream(line); 
    std::string   data; 
    int     val1; 
    int     val2; 

    // If you have truly tab delimited data use getline() with third parameter. 
    // If your data is just white space separated data 
    // then the operator >> will do (it reads a space separated word into a string). 
    std::getline(linestream, data, '\t'); // read up-to the first tab (discard tab). 

    // Read the integers using the operator >> 
    linestream >> val1 >> val2; 
} 
2
std::ifstream in("fname"); 
while(in){ 
    std::string line; 
    std::getline(in,line); 
    size_t lasttab=line.find_last_of('\t'); 
    size_t firsttab=line.find_last_of('\t',lasttab-1); 
    mystruct data; 
    data.chr=line.substr(0,firsttab).c_str(); 
    data.v1=atoi(line.substr(firsttab,lasttab).c_str()); 
    data.v2=atoi(line.substr(lasttab).c_str()); 
} 
+0

bu kod geçersiz çıktı verir! – sikas

+1

Lütfen, neden döngünün koşulunda kullanılmamasına bakın. –

3

Bu yapıyı C için de kullanmayı düşünmüyorsanız, belirtilen char * dosyasını std :: string ile değiştiririm.

Sonraki, ben aşağıdaki işlevi yazardım bir akıştan bunu okumak mümkün niyetinde olarak: std :: string üye olarak str

std::istream & operator>>(std::istream & is, myStruct & my) 
{ 
    if(std::getline(is, my.str, '\t')) 
     return is >> my.v1 >> my.v2; 
} 

. Bu, ilk sınırlayıcı olarak sekmeyi kullanarak yapınıza yazıyor ve herhangi bir beyaz boşluk sınırlayıcısı sonraki iki tam sayıdan önce yapacaktır. (Sekmeyi kullanmak için zorlayabilirsiniz).

Satır satırını okumak için bunları okumaya devam edebilir veya önce bir dizgeyi okuyabilir, ardından dizeyi bir yayın dizisine aktarabilir ve yukarıdakileri arayabilirsiniz.

Hatalı okumaların nasıl işleneceğine karar vermeniz gerekecektir. Yukarıdaki başarısız okumalar, akışı başarısız bir durumda bırakacaktır.

İlgili konular