2013-02-28 23 views
9

Tôi cần đọc từ một tệp .data hoặc .txt chứa số mới float trên mỗi dòng vào một vectơ.Làm thế nào để đọc một tập tin vào vector trong C + +?

Tôi đã tìm kiếm nhiều và nhiều phương pháp khác nhau nhưng mỗi khi tôi nhận được kết quả tương tự, của Main.size() của 0 và lỗi nói "Vector Subscript out of Range", rõ ràng là vectơ không đọc bất kỳ thứ gì vào tệp.

Lưu ý: tệp nằm trong thư mục và cũng có trong dự án VS.

Dù sao, đây là mã của tôi:

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <vector> 
#include <string> 

using namespace std; 

int main() { 

    vector<double> Main; 
    int count; 
    string lineData; 
    double tmp; 

    ifstream myfile ("test.data", ios::in); 

    double number; 

    myfile >> count; 
    for(int i = 0; i < count; i++) { 
     myfile >> tmp; 
     Main.push_back(tmp); 
     cout << count; 
    } 

    cout << "Numbers:\n"; 
    cout << Main.size(); 
    for (int i=0; i=((Main.size())-1); i++) { 
     cout << Main[i] << '\n'; 
    } 

    cin.get(); 
    return 0; 
} 

Kết quả tôi nhận được là luôn luôn đơn giản:

Numbers: 
0 
+1

Kiểm tra kết quả của tất cả các hoạt động I/O. – hmjd

+0

'Test.data' của bạn trông như thế nào? – us2012

+0

vui lòng xem xét de/-serialization. thông thường bạn sẽ tạo một lớp vectơ và một lớp sưu tập vectơ (có thể xử lý tệp đầu vào txt). Một khởi đầu tốt là câu trả lời cho điều này: http://stackoverflow.com/questions/11415850/c-how-serialize-deserialize-objects-without-any-library – Najzero

Trả lời

25

vòng lặp của bạn là sai:

for (int i=0; i=((Main.size())-1); i++) { 

Hãy thử điều này:

for (int i=0; i < Main.size(); i++) { 

Ngoài ra, một cách thành ngữ hơn đọc số vào một vector và viết chúng vào stdout là một cái gì đó dọc theo những dòng:

#include <iostream> 
#include <iterator> 
#include <fstream> 
#include <vector> 
#include <algorithm> // for std::copy 

int main() 
{ 
    std::ifstream is("numbers.txt"); 
    std::istream_iterator<double> start(is), end; 
    std::vector<double> numbers(start, end); 
    std::cout << "Read " << numbers.size() << " numbers" << std::endl; 

    // print the numbers to stdout 
    std::cout << "numbers read in:\n"; 
    std::copy(numbers.begin(), numbers.end(), 
      std::ostream_iterator<double>(std::cout, " ")); 
    std::cout << std::endl; 

} 

mặc dù bạn nên kiểm tra tình trạng của ifstream lỗi đọc.

+1

Và ở đó bạn đi. Lỗi gán ẩn. Cảm ơn c! –

+0

ha, không thấy điều đó. – Najzero

+0

OK công trình này tuyệt vời nhưng bây giờ nó chỉ có vẻ là vấn đề là nó không tìm thấy tập tin hoặc đang đọc các tập tin như trống. – Orgmo

5

Chỉ cần mở rộng về câu trả lời của juanchopanza một chút ...

for (int i=0; i=((Main.size())-1); i++) { 
    cout << Main[i] << '\n'; 
} 

thực hiện điều này:

  1. Tạo i và đặt nó vào 0.
  2. Đặt i thành Main.size() - 1. Vì Main trống, Main.size()0i được đặt thành -1.
  3. Main[-1] là quyền truy cập ngoài giới hạn. Kaboom.
3

Chỉ là một lời khuyên. Thay vì viết

for (int i=0; i=((Main.size())-1); i++) { 
    cout << Main[i] << '\n'; 
} 

như gợi ý ở trên, hãy viết một:

for (vector<double>::iterator it=Main.begin(); it!=Main.end(); it++) { 
    cout << *it << '\n'; 
} 

sử dụng lặp. Nếu bạn có C++11 hỗ trợ, bạn có thể khai i như auto i=Main.begin() (chỉ cần một phím tắt tiện dụng mặc dù)

Điều này tránh sự khó chịu một vị trí-out-of-bound lỗi gây ra bằng cách bỏ đi một -1 vô ý.

1

1. Trong vòng lặp bạn đang gán giá trị chứ không phải so sánh giá trị để

i = ((Main.size()) - 1) -> i = (- 1) kể từ Main.size()

Main [ i] sẽ sinh ra "Chỉ số Vector ngoài phạm vi" coz i = -1.

2. Bạn nhận được Main.size() là 0 có thể vì nó không phải là nó không thể tìm thấy tệp. Cho đường dẫn tập tin và kiểm tra đầu ra. Ngoài ra nó sẽ là tốt để khởi tạo các biến.

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