2010-10-11 76 views
19

Tôi muốn đọc dòng tệp txt theo dòng và sau khi đọc từng dòng, tôi muốn chia dòng theo tab "\ t" và thêm từng phần thành phần tử trong cấu trúc.C++ Đọc dòng tập tin theo từng dòng rồi chia từng dòng bằng cách sử dụng dấu phân cách

struct của tôi là 1 * char và 2 * int

struct myStruct 
{ 
    char chr; 
    int v1; 
    int v2; 
} 

nơi chr thể chứa nhiều hơn một ký tự.

Một dòng nên một cái gì đó như:

randomstring TAB number TAB number NL 
+7

một char không thể chứa nhiều hơn một ký tự, có thể bạn có nghĩa là char * cũng là mục đích của v1 và 2 không hoàn toàn rõ ràng đối với tôi. – flownt

+0

@flownt: vâng lỗi của tôi. – sikas

+4

Vì vậy, những gì ngăn cản bạn? –

Trả lời

24

Hãy thử:
Lưu ý: nếu chr thể chứa nhiều hơn 1 nhân vật sau đó sử dụng một chuỗi đại diện cho nó.

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

mã này cho đầu ra không hợp lệ !! – sikas

+1

Hãy tra cứu lý do tại sao không sử dụng trong điều kiện của vòng lặp. –

3

Trừ khi bạn có ý định sử dụng cấu trúc này cho C, tôi sẽ thay thế char dự định * bằng chuỗi std ::.

Tiếp theo, khi tôi có ý định để có thể đọc nó từ một dòng Tôi sẽ viết hàm sau:

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

với str là thành viên std :: string. Điều này viết vào cấu trúc của bạn, sử dụng tab làm dấu tách đầu tiên và sau đó bất kỳ dấu cách trắng nào sẽ làm trước hai số nguyên tiếp theo. (Bạn có thể buộc nó sử dụng tab).

Để đọc từng dòng, bạn có thể tiếp tục đọc những dòng này hoặc đọc dòng đầu tiên thành chuỗi rồi đặt chuỗi đó vào chuỗi istringstream và gọi ở trên.

Bạn sẽ cần phải quyết định cách xử lý các lần đọc không thành công. Mọi lần đọc không thành công ở trên sẽ khiến luồng ở trạng thái không thành công.

Các vấn đề liên quan