2013-09-30 41 views
5

在C++中,我想讀取一個帶有浮動列的文本文件,並將它們放入一個2d數組中。C++讀取.txt的浮點值並將它們放入未知大小的二維數組中

第一行將是第一列,依此類推。

數組的大小是未知的,它取決於可能會有所不同的行和列。

我試過「getline」,「inFile >>」,但是我所做的所有更改都有一些問題。

例如,是否有辦法刪除不必要的行/行後值?

文件看起來像這樣(+/-):

  • 字符 「\ t」 的字符 「\ t」 的字符 「\ n」 個
  • 浮動 「\ t」 的浮動 「\ t」 的浮動「 \ t「float」\ n「
  • float」\ t「float」\ t「float」\ t「float」\ n「
  • float」\ t「float」\ t「float」 「\ n」

謝謝

直到現在我有這樣的:

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

最好發表一些代碼,並提供有關它的「問題」的更多細節。 –

+0

該文件是什麼樣子的?你能編輯你的文章嗎? – 0x499602D2

+0

我的代碼現在可以使用,請參閱下面的內容。 – 0x499602D2

回答

1

我想這可能會幫助你。因爲您不知道項目數量的計數,因此請使用類型爲float的矢量的矢量。此代碼假定您在每行有一個空格分隔的float數字。

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

你的代碼實際上並沒有編譯。 – 0x499602D2

+0

正常情況下,文本文件中的數字由製表符或空格分隔。數組可以做到嗎? – JMG

+0

@ 0x499602D2實際上它爲我編譯但引發了一個異常。感謝您指出它! – Saksham

5

最簡單的方法是使用向量:

#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數組來完成。當然,這可以做到這一點:

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

不應該增加內部循環之外的計數器嗎? – Saksham

+0

@Saksham是的,謝謝 – 0x499602D2

+0

,現在你錯過了分號:) – Saksham

相關問題