C++ C++;——需要帮助解决while循环问题吗

C++ C++;——需要帮助解决while循环问题吗,c++,C++,所以,我们需要知道为什么这个循环会永远循环。我想要它做的是读取一个新的m,然后为for循环设置术语。因此,它读取m,然后将其计算成一个数组,然后读取一个新的m,等等。目前它读取一个m,并永远执行for循环 while(inputFile >> m) { while (m != 0) { cout << "m=" << m << endl; for (i=0; i < (m*m); i++) { cout &

所以,我们需要知道为什么这个循环会永远循环。我想要它做的是读取一个新的m,然后为for循环设置术语。因此,它读取m,然后将其计算成一个数组,然后读取一个新的m,等等。目前它读取一个m,并永远执行for循环

while(inputFile >> m) {
  while (m != 0) { 
    cout << "m=" << m << endl;
    for (i=0; i < (m*m); i++) { 
      cout << "m times m = " << (m*m) << endl;
      for (ROW=0; ROW < m; ROW++) {
        inputFile >> image[ROW][COL];
        cout << "array= " << image[ROW][COL] << endl;
          for (COL=0; COL < m; COL++) {
            inputFile >> image[ROW][COL];
            cout << "array= " << imagee[ROW][COL] << endl;
          }
        }
      }
    }
  }
}

您会发现,如果稍微清理一下代码,就不会有无限循环:

while(inputFile >> m) {
  while (m != 0) {
    ...
可以组合为以下内容:

while(inputFile >> m && m != 0) {
现在,一旦
for循环
完成,将从
输入文件
中读取另一个
m

让我们看看为什么它以前不起作用。假设
inputFile
提取了4并将其绑定到
m

而(4!=0)
始终为真,因此这是无限循环<在此之后,无法再次从
inputFile
读取code>m

或者你也可以写

while(inputFile >> m) {
      if (m != 0) {
        ...
这将保证处理整个文件,跳过0的值

编辑

读取
m
后,需要使用
inputFile.get()
使用换行符

我已经编写了一个小驱动程序来向您展示如何做到这一点,但是我使用了
std::vector
s而不是数组-它们更易于使用

下面是正在读取两个数组的示例

代码:

#包括
#包括
#包括
#包括
#包括
无效输出矩阵(常数std::向量arr,大小m){
标准:冷却温度;
arr[i][j]=温度;
}
}
输出矩阵(arr,m);
}
}
int main(){
读取矩阵(标准::cin);
返回0;
}
问题在于:

while(inputFile >> m) {
  while (m != 0) {
您有一个外部循环,在其中读入
m
,还有一个内部循环,当
m
为0时结束。问题在于,在内部循环完成之前,不会再次检查外部循环的条件。内部循环永远不会完成,因为读取到
m
,而这恰好也是外部检查,永远不会到达


通常,如果有loop1和loop2,loop2是loop1的内部循环,则通过loop1到达loop2,但一旦到达loop2,必须在检查loop1的条件之前完成。如果loop1未完成,则将重新启动loop2,依此类推。

格式化。。。我的眼睛…
m
不会在
循环中被修改,而
循环将始终具有其初始(非零)值。考虑在<<代码> <代码> >代码> > 并查看它是否使您更接近您想要的。对格式进行道歉。哪一个while循环应该更改?它仍然是无限循环,即使使用组合while条件。@brkville42ny它可能与错误读取非整数值有关。不确定此信息是否有用,但读取的文件只是int。它仍然是无限循环。文件结束措施是否合适?我知道这些并不总是明智的使用。尽我所能,是的。
#include <iostream>
#include <sstream>
#include <string>
#include <istream>
#include <vector>

void output_matrix(const std::vector<std::vector<int > > arr, size_t m) {
    std::cout << "Matrix we read in was: " << std::endl;
    for(size_t i = 0; i < m; ++i) {
        for(size_t j = 0; j < m; ++j) {
            std::cout << arr[i][j] << " ";
        }
        std::cout << std::endl;
    }
}

void read_matrix(std::istream &in) {
    size_t m = 0;
    while(in >> m && m > 0) {
        std::vector<std::vector<int > > arr(m);
        // Swallow the newline after reading in `m`.
        in.get();
        std::string line;
        for(size_t i = 0; i < m; ++i) {
            arr.resize(m);
            /* 
                `std::getline` will swallow newlines in other lines until `m`
                needs to be read again.
            */
            std::getline(std::cin, line);
            std::stringstream ss(line);
            for(size_t j = 0; j < m; ++j) {
                arr[i].resize(m);
                int temp = 0;
                ss >> temp;
                arr[i][j] = temp;
            }
        }
        output_matrix(arr, m);
    }
}

int main() {
    read_matrix(std::cin);
    return 0;
}
while(inputFile >> m) {
  while (m != 0) {