2013-01-28 34 views
5

Vì vậy, tôi đang thử nghiệm để thêm tên và họ vào danh sách được liên kết kép. Tôi có một tệp văn bản có độ dài khác nhau với định dạng "chuỗi, chuỗi" và đang sử dụng danh sách> để lưu trữ dữ liệu của tôi.nhầm lẫn về danh sách và cặp

Tôi đang sử dụng mã này:

typedef std::list< std::pair<string,string> > listPair; 

...

list<pair<string, string> > mylist; 
ifstream myFile; 
myFile.open("20.txt"); 

pair<string, string> stuff; 
while (myFile >> stuff.first >> stuff.second) 
{ 
    mylist.push_back(stuff); 
} 

listPair::iterator iter = mylist.begin(); 

for(;iter != mylist.end();iter++) 
{ 
    string s = (*iter).first; 
    cout << s << endl; 
    string c = (*iter).second; 
    cout << c << endl; 
} 

bây giờ vấn đề tôi đang gặp là trước hết, mục cuối cùng trong danh sách không được bổ sung. giống như mọi tập tin chỉ bỏ lỡ dòng kết thúc, vì vậy đó là một chút khó hiểu.

Ngoài ra, tôi đang thực hiện "mylist.size()" để đảm bảo tất cả các tên đã được thêm vào, và điều này gây nhầm lẫn cho tôi vì nói một tệp văn bản có 99 tên, tức là 99 dòng văn bản (không quên nó chỉ đọc trong 98 do thiếu dòng cuối cùng) rằng danh sách có kích thước 48.

TẠI SAO 48? Có điều gì đó cần làm vì tôi đã thực hiện các cặp, điều này sẽ không có ý nghĩa như thể nó không đọc theo cặp sẽ thực sự gấp đôi, vì các cặp chỉ lấy tên và họ là một giá trị.

Tâm boggling với tôi.

một lần nữa cảm ơn sự giúp đỡ của bạn!

+0

Có thể bạn đang tìm kiếm 'getline'? –

+2

Cũng giống như một lưu ý phụ, như một container đa năng, bạn nên sử dụng 'vector' thay vì' danh sách'. Từ cách bạn đang sử dụng nó, tôi không thấy sự cần thiết cho một 'danh sách' ở đây. –

+0

Bạn có thể thêm tệp đầu vào '20.txt' (hoặc ít nhất một trích xuất) không? Có thể đầu vào của bạn không được định dạng đúng. – Zeta

Trả lời

5

Tôi có một cảm giác tập tin của bạn không thực sự có khoảng trống giữa các giá trị như bạn đã mô tả, vì vậy nó trông như thế này:

one,two 
three,four 
five,six 
seven,eight 
nine,ten 

Nếu bạn đang chạy chương trình của bạn về vấn đề này, kích thước của số list sẽ là 2 (floor(number_of_lines/2), mà bạn sẽ cho 48) và dòng cuối cùng sẽ không được đặt trong số list. Tại sao?

Thứ nhất, mỗi cuộc gọi đến std::ifstream::operator>>(std::string&) sẽ trích xuất cho đến khi nó chạm một số khoảng trắng. Trong trường hợp này, khoảng trắng đầu tiên trên dòng đầu tiên là \n ở cuối dòng. Vì vậy, trong lần lặp đầu tiên, stuff.first sẽ là "one,two" và sau đó dòng tiếp theo sẽ được đọc vào stuff.second, làm cho nó "three,four". Điều này sau đó được đẩy vào list. Hai dòng tiếp theo được đọc theo cùng một cách, cho bạn cặp số {"five,six","seven,eight"}. Trong lần lặp tiếp theo, số operator>> đầu tiên sẽ trích xuất "nine,ten" và số thứ hai sẽ không thành công, khiến điều kiện while kết thúc và dòng cuối cùng bị hủy.

Ngay cả khi bạn đã có dấu cách, bạn sẽ kết thúc bằng dấu phẩy trong first của mỗi pair, chắc chắn không phải là thứ bạn muốn.

Cách đẹp hơn để tiếp cận một vấn đề như thế này là sử dụng std::getline để trích xuất một dòng, và sau đó phân tích dòng như phù hợp:

std::string line; 
std::pair<std::string, std::string> line_pair; 
while (std::getline(myFile, line)) { 
    std::stringstream line_stream(line); 
    std::getline(line_stream, line_pair.first, ','); 
    std::getline(line_stream, line_pair.second); 
    mylist.push_back(line_pair); 
} 

tôi cũng khuyên bạn nên sử dụng std::vector trừ khi bạn có lý do chính đáng để sử dụng std::list.

+0

cảm ơn bạn, đây chính là vấn đề của tôi và nó hoạt động hoàn hảo! gosh tìm hiểu điều gì đó mới mẻ mỗi ngày haha –

-1

Nhà điều hành > > trên ifstream coi dòng mới là một mã thông báo khác. Do đó nó có thể sẽ đọc từ đầu tiên và thứ hai của bạn như bình thường từ dòng đầu tiên của bạn, nhưng mã thông báo thứ ba đọc là dòng mới trên dòng đầu tiên.

Hãy thử sử dụng đường dây để 'ăn' dòng mới.

+3

Bộ giải nén xử lý các dòng mới giống như bất kỳ không gian màu trắng nào khác. Bạn không cần phải bỏ qua chúng nếu bạn luôn sử dụng 'toán tử >>'. –