2013-01-13 65 views
1

我創建了一個C++應用程序來讀取文件的內容到一個數組:應對文件內容轉換成一個多維數組

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 



int main() 
{ 
    fstream myfile; 
    myfile.open("myfile.txt"); 
    int a[3]; 
    int counter = 0; 
    char s[10]; 
    while (!myfile.eof()) 
    { 
     myfile.getline(s, 10,';'); 
     a[counter]=atoi(s); 
     counter++; 
    } 

    for (int i = 0 ; i<3 ; i++) 
     cout << a[i]<<endl; 

    cin.get(); 
} 

和內容,如果我的文件是:

15;25;50 

,它的做工精細

我的問題是: 如果我更改文件:

15;25;50 

12;85;22 

我如何可以讀取所有的文件變成了3 * 2陣列?

+0

好了,我找不到任何方式做到這一點:( – Arashdn

+0

1.使用'的std :: string',而不是字符數組和'的std :: VECTOR',而不是如果你有三個以上是溢出的數組文件中的行。2.使用'而(函數getline())','不同時(!EOF())'。3.使用像'stoi',而不是'atoi',這完全沒有告訴如果方式這是一個錯誤4.不想'的std :: whatever'爲'使用命名空間std;' – chris

+0

那麼,你認爲你需要做的你如何定義一個3×2矩陣(二維數組) –

回答

2

您有兩個分隔符;和換行符(\n),這使事情變得複雜一點。您可以閱讀完整的一行,然後再分割此行。我也建議使用std::vector不是純陣列

std::vector<std::vector<int> > a; 
std::string line; 
while (std::getline(myfile, line)) { 
    std::vector<int> v; 
    std:istringstream ss(line); 
    std::string num; 
    while (std::getline(ss, num, ';')) { 
     int n = atoi(num); 
     v.push_back(n); 
    } 

    a.push_back(v); 
} 

使用普通陣列是可能的,太。然後,您必須確保,如果行數多於數組允許的數量,則不要覆蓋數組。

如果你有一列總是三個數字,你也可以利用這一點,在;拆分前兩個數字,並在\n

int a[2][3]; 
for (int row = 0; std::getline(myfile, s, ';'); ++row) { 
    a[row][0] = atoi(s); 
    std::getline(myfile, s, ';')); 
    a[row][1] = atoi(s); 
    std::getline(myfile, s)); 
    a[row][2] = atoi(s); 
} 

第三個不過這是否會失敗,當然,你連續有三個以上的數字,更糟糕的是,有超過兩行的數字。

+1

你可以使用'stringstream'從字符串轉換爲int,而不是'的atoi ()',因爲你的代碼完全是C++。 – prajmus

+0

或使用stoi(),它將std :: string作爲arg。 –

+0

@prajmus你說的對,這個或者使用'std :: stoi'會是另一個改進。另一方面,如果你在輸入中只有數字,'atoi'並不算太壞。 –