2013-09-30 17 views
5

Trong C++, tôi muốn đọc một tệp văn bản có cột nổi và đặt chúng trong mảng 2d.C++ đọc giá trị float từ .txt và đặt chúng vào một mảng 2D có kích thước không rõ

Dòng đầu tiên sẽ là cột thứ nhất và cứ tiếp tục như vậy.

Kích thước của mảng không xác định, nó phụ thuộc vào các dòng và cột có thể thay đổi.

Tôi đã thử với "getline", "inFile >>", nhưng tất cả thay đổi tôi đã thực hiện đều có một số vấn đề.

Ví dụ: Có cách nào để xóa các hàng/dòng không cần thiết sau khi các giá trị có ở đó không?

tập tin trông như thế này (+/-):

  • chars "\ t" chars "\ t" chars "\ n"
  • phao "\ t" phao "\ t" phao " \ t "float" \ n "
  • float" \ t "float" \ t "float" \ t "float" \ n "
  • float" \ t "float" \ t "float" \ t "float "\ n"

Cảm ơn

Đến bây giờ tôi có điều này:

int ReadFromFile(){ 

ifstream inFile; 
ofstream outFile; 

int nLinActual = 0; 
const int nCol = 9; 
const int nLin = 10; 

// open file for reading 
inFile.open("values.txt"); 
// checks if file opened 
if(inFile.fail()) { 
    cout << "error loading .txt file reading" << endl; 
    return 1; 
} 
// open file for writing 
outFile.open ("outArray.txt"); 
// checks if file opened 
if(outFile.fail()) { 
    cout << "error loading .txt file for writing" << endl; 
    return 1; 
} 

// Doesn't read the first line 
string dummyLine, dummyLine2, dummyLine3; 
getline(inFile, dummyLine); 

// Declares Array 
float values[nLin][nCol]; 

//Fill Array with -1 
for(int l=0; l<nLin; l++) 
    for(int c=0; c<nCol; c++) 
     values[l][c] = -1; 

// reads file to end of *file*, not line 
while(!inFile.eof()) { 

    for (int i=0; i<nCol; i++) { 
     inFile >> values[i][nLinActual]; 
    } 
    i=0;  
    ++nLinActual; 
} 

// Check what's happening 
cout << endl; 
for(int l=0; l<nLin; l++){ 
    for(int c=0; c<nCol; c++){ 
     cout << values[l][c] << "\t"; 
     outFile << values[l][c] << "\t"; 
    } 
    cout << endl; 
    outFile << endl; 
} 

inFile.close(); 
outFile.close(); 


return 0; 

}

+1

Tốt nhất để đăng một số mã và cung cấp thêm chi tiết về "sự cố" mà bạn đã gặp phải. –

+0

Tệp trông như thế nào? Bạn có thể sửa bài viết của mình không? – 0x499602D2

+0

Mã của tôi hoạt động ngay bây giờ, vui lòng xem bên dưới. – 0x499602D2

Trả lời

1

Tôi nghĩ rằng đây có thể giúp bạn. Sử dụng vectơ của vectơ loại float vì bạn không biết số lượng mặt hàng. Mã này giả định rằng bạn có một số float được phân cách bằng dấu cách tại mỗi dòng.

fstream fs; 
fs.open("abc.txt",ios::in); 
vector<vector<float>> floatVec; 
string strFloat; 
float fNum; 
int counter = 0; 
while(getline(fs,strFloat)) 
{ 
    std::stringstream linestream(strFloat); 
    floatVec.push_back(std::vector<float>()); 
    while(linestream>>fNum) 
     floatVec[counter].push_back(fNum); 
    ++counter; 
} 
+0

Mã của bạn không thực sự biên dịch. – 0x499602D2

+0

Bình thường các số trong tệp văn bản được phân tách bằng các tab hoặc một số khoảng trống. Có thể làm điều đó với mảng? – JMG

+0

@ 0x499602D2 thực sự nó biên dịch cho tôi nhưng ném một ngoại lệ. Cảm ơn đã chỉ ra điều đó!! – Saksham

5

Cách đơn giản nhất là sử dụng một vector:

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

int main() 
{ 
    std::fstream in("in.txt"); 
    std::string line; 
    std::vector<std::vector<float>> v; 
    int i = 0; 

    while (std::getline(in, line)) 
    { 
     float value; 
     std::stringstream ss(line); 

     v.push_back(std::vector<float>()); 

     while (ss >> value) 
     { 
      v[i].push_back(value); 
     } 
     ++i; 
    } 
} 

Cập nhật: Bạn nói rằng bạn cần nó để được thực hiện bằng mảng C thô. Chắc chắn, điều này có thể được thực hiện:

int main() 
{ 
    std::ifstream in("in.txt"); 
    std::string line; 

    float v[9][10]; 
    int i = 0, k = 0; 

    while (std::getline(in, line)) 
    { 
     float value; 
     int k = 0; 
     std::stringstream ss(line); 

     while (ss >> value) 
     { 
      v[i][k] = value; 
      ++k; 
     } 
     ++i; 
    } 
} 
+0

bạn có nên tăng bộ đếm ngoài vòng lặp bên trong không? – Saksham

+0

@Saksham Có, cảm ơn – 0x499602D2

+0

và bây giờ bạn đã bỏ lỡ dấu chấm phẩy :) – Saksham

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