如何从文件中读取输入?

时间:2011-03-18 14:33:47

标签: c++ inputstream ifstream

我正在尝试将文件中的输入读入数组。我似乎完成了需要,但代码不能正常工作。请告诉我哪里出错了。这是我的代码:

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.

5 个答案:

答案 0 :(得分: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文件的目录不同。

答案 1 :(得分: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);

答案 2 :(得分:0)

使用fstream时,为了进行健壮的编码,最好在open()之后用is_open()检查错误条件,在运算符&lt;&lt;()之后检查fail()。
此外,更喜欢

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

这样你就可以查看你正在读什么行以及出了什么问题。

快乐检查......

答案 3 :(得分:0)

我认为你想从文件中加载矩阵。在文件中,您的值存储为由空格分隔的字符串。因此,您应该加载文件,逐行读取文件,将字符串分隔为字符串数组,并将值从字符串转换为int并将它们存储到矩阵中。

答案 4 :(得分: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.