2011-03-18 128 views
0

我想從文件讀取輸入到數組中。我似乎已經完成了必要的工作,但代碼並未按照應有的方式工作。請告訴我我哪裏錯了。這是我的代碼:如何從文件讀取輸入?

int pb[10][10]; 
int i,j,n; 
string ip_filename = string("pro.txt"); 

    ifstream fil1; 

    fil1.open(ip_filename.c_str()); 

// to store the probabilities of the nodes 
for(i=0;i<num_rows;i++) 
    for(j=0;j<num_cols;j++) 
    fil1 >> pb[i][j]; 

fil1.close(); 

for(i=0;i<num_rows;i++) 
{ 
for(j=0;j<num_cols;j++) 
    cout<<pb[i][j]<<" "; 
cout<<endl; 
} 

該文本文件與cpp文件位於同一目錄中。在打印輸出時,不管文件中的值如何,它都會打印0。

該文件中的值是商店如下

0 1 2 3 
4 5 6 7 
8 9 10 11 
12 13 14 15 

num_rowsnum_cols在代碼中預先定義的,兩者都有值4

+0

你確定你的文件加載不錯? – Kipotlov 2011-03-18 14:36:56

+0

代碼不完整。 num_rows和num_cols未定義。 – etarion 2011-03-18 14:37:07

+0

錯誤檢查代碼和/或調試將回答你的問題比我可以更好... – stefaanv 2011-03-18 14:38:23

回答

1

此代碼工作完全正常,我與格式像你pro.txt顯示:

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main() 
{ 
    int num_rows = 4; 
    int num_cols = 4; 
    int pb[10][10]; 
    int i,j,n; 
    string ip_filename = string("pro.txt"); 

    ifstream fil1; 

    fil1.open(ip_filename.c_str()); 

    // to store the probabilities of the nodes 
    for(i=0;i<num_rows;i++) 
     for(j=0;j<num_cols;j++) 
      fil1 >> pb[i][j]; 

    fil1.close(); 

    for(i=0;i<num_rows;i++) 
    { 
     for(j=0;j<num_cols;j++) 
      cout<<pb[i][j]<<" "; 
     cout<<endl; 
    } 

} 

我的建議是,以確保pro.txt是在同一目錄下,你.exe文件。如果您使用IDE來構建此代碼,則它可能與您的.cpp文件不同。

+0

哇。 gr8建議DAVE。但現在我得到垃圾值,而不是int值。是否在代碼中的任何概率? – CHID 2011-03-18 16:03:01

+0

@CHID我建立並運行正是發佈,它工作正常。嘗試查看此代碼與您的代碼之間可能存在的差異。我做的唯一事情就是包裝你在'main()'函數中發佈的代碼並定義'num_rows'和'num_cols'。 – 2011-03-18 16:27:17

0

通常做這些事情的最簡單方法是將數據存儲在一個平面陣列中(或者更好的是std::vector),並使用簡單的算法按行和列訪問元素。這使事情變得更簡單。

對此的包裝看起來是這樣的:

template<int ColumnCount> 
class MyMatrix { 
public: 
    template<class T> 
    MyMatrix(T & begin, T & end) : data(begin, end) {} 

    int getItem(int i, int j) const { 
     return data[i*ColumnCount+j]; 
    } 
private: 
    std::vector<int> data; 
}; 

然後你可以看這樣的數據:

std::ifstream file1("pro.txt"); 
std::istream_iterator<int> begin(file1); 
std::istream_iterator<int> end; 

MyMatrix<4> m(begin, end); 
0

當使用fstream的,對於穩健的編碼,這是最好的檢查錯誤在運算符< <()後打開()和失敗()後,使用is_open()的條件。
此外,喜歡

while(getline(fil1, lineString)) 
{ 
    ...; 
} 

,所以你可以檢查你正在讀什麼行和什麼錯誤。

快樂檢查...

+0

謝謝你stefaanv。使它更清晰:) – CHID 2011-03-18 15:00:21

0

正如我看到你想從文件加載矩陣。在文件中,您的值以空格分隔的字符串存儲。所以你應該加載你的文件,逐行讀取文件,將你的字符串分成一個字符串數組,並將你的值從字符串轉換爲int並將它們存儲到矩陣中。

+0

哦,是..我試圖直接做。可能是你喲我dint得到..謝謝你Andrel – CHID 2011-03-18 14:57:00

+0

ifstream做你的轉換。它將讀取該空間並嘗試將讀取的內容轉換爲要存儲的變量的類型。 – 2011-03-18 14:58:27

+0

@dave:如果這樣,我的文件遵循ifstream的格式。還沒有輸出.. ifstream在遇到\ n時會做什麼\ n字符 – CHID 2011-03-18 15:04:58

0

每次操作後流的狀態如何?您不應該在未經驗證的情況下閱讀 。你不應該閱讀,而不必 驗證了開放式的工作:

ifstream fill(ip_filename.c_str()); 
if (!fill) { 
    // error handling, open failed... 
} 

在那之後,我會讀一行一行的建議達成一致:

int row = 0; 
string line; 
while (getline(fill, line) && row < size(pb)) { 
    istringstream sLine(line); 
    int col = 0; 
    int tmp ; 
    while (sLine >> tmp && col < size(pb[ row ])) { 
     pb[row][col] = tmp; 
     ++ col; 
    } 
    if (col != size(pb[ row ])) { 
     // Input error, too few entries 
    } else if (sLine >> ws && sLine.get() != EOF) { 
     // Input error, garbage at end of line <row> 
    } 
    ++ row; 
} 
if (row != size(pb)) { 
    // Input error, garbage at end of file 
} 

或者,你可以決定在尺寸上動態地按 輸入:

std::vector<std::vector<int> > pb; 
ifstream fill(ip_filename.c_str()); 
if (!fill) { 
    // error handling, open failed... 
} 
string line; 
while (getline(fill, line)) { 
    std::vector<int> tmp1; 
    istringstream sLine(line); 
    int tmp2; 
    while (sLine >> tmp2) { 
     tmp1.back().push_back(tmp2); 
    } 
    if (sLine >> ws && ! sLine.eof()) { 
     // input error: non-numeric data in line 
    } else if (! pb.empty() && tmp1.size() != pb.back().size()) { 
     // input error : inconsistent number of columns. 
    } 
} 
// Check here if square matrix required.