2

好的,我正在经历一些编程练习,但遇到了一个涉及读取文件的练习。我需要做的是将一组线读入一个二维数组,线的长度和线的数量会有所不同,但我事先知道。

所以文件的格式如下:

有两个数字,nm,其中1 <= n, m <= 20

现在进入格式如下的文件:(n两个数字之间有一个空格)mn m

现在在那条线之后有n几行整数,m每行都有元素。因此,例如输入是这样的:(数字在范围内)0 <= # <= 50

5 3
2 2 15
6 3 12
7 3 2
2 3 5
3 6 2

所以从这个程序知道有 15 个元素,并且可以像这样保存在一个数组中: int foo[5][3]

那么我如何读取这样的文件呢?并且,最后,该文件具有一组接一组的输入。所以它可能会这样:(2, 2 是第一组的信息,3, 4 是第二组输入的信息)

2 2
9 2
6 5
3 4
1 2 29
9 6 18
7 50 12

如何从 C++ 文件中读取这种输入?

4

2 回答 2

2

首先,您应该有某种矩阵/网格/2darray 类

//A matrix class that holds objects of type T
template<class T>
struct matrix {
    //a constructor telling the matrix how big it is
    matrix(unsigned columns, unsigned rows) :c(columns), data(columns*rows) {}
    //construct a matrix from a stream
    matrix(std::ifstream& stream) {
        unsigned r;
        stream >> c >> r;
        data.resize(c*r);
        stream >> *this;
        if (!stream) throw std::runtime_error("invalid format in stream");
    }
    //get the number of rows or columns
    unsigned columns() const {return c;}
    unsigned rows() const {return data.size()/c;}
    //an accessor to get the element at position (column,row)
    T& operator()(unsigned col, unsigned row) 
    {assert(col<c && row*c+col<data.size()); return data[data+row*c+col];}
protected:
    unsigned c; //number of columns
    std::vector<T> data; //This holds the actual data
};

然后你只需重载 operator<<

template<class T>
std::istream& operator>>(std::istream& stream, matrix<T>& obj) {
    //for each row
    for(int r=0; r<obj.rows(); ++r) {
        //for each element in that row
        for(int c=0; c<obj.cols(); ++c)
            //read that element from the stream
            stream >> obj(c, r);  //here's the magic line!
    }
    //as always, return the stream
    return stream;
}

非常坦率的。

int main() {
   std::ifstream input("input.txt");
   int r, c;
   while(input >> c >> r) { //if there's another line
       matrix<char> other(c, r); //make a matrix
       if (!(input >> other)) //if we fail to read in the matrix
           break;  //stop
       //dostuff
   }
   //if we get here: invalid input or all done 
}
于 2012-09-18T20:13:20.133 回答
0

您需要一种在运行时动态分配内存的方法,因为这是您知道需要从文件中读取多少数据的时候。有(至少)两种方法可以做到这一点:

  1. 按照@MooingDuck 的建议使用 std:vector

  2. new使用or运算符动态分配您的数组new[]。您还需要确保使用deleteordelete[]运算符释放任何内存。

于 2012-09-18T20:17:09.320 回答