无法从文件到矩阵读取整数

时间:2015-12-18 17:47:46

标签: c++ arrays

我必须从文件中读取一个未知大小的数字数组并将其保存为矩阵。代码必须尽可能紧凑,这就是为什么我不想将文件作为字符串读取然后将其转换为int。

int main() 
{   
    ifstream infile("array.txt");
    int n, counter = 0, **p;
    while (!infile.eof()) {
        counter++;
    }

    counter = sqrt(counter);
    cout << "counter is " << counter << endl;
    p = new int*[counter];

    for (int i = 0; i < counter; i++)
        p[i] = new int[counter];

    while (!infile.eof()) {
        for (int i = 0; i < counter; i++) {
            for (int j = 0; j < counter; j++)
                p[i][j] = n;
        }
    }
    for (int i = 0; i < counter; i++) {
        for (int j = 0; j < counter; j++) {
        cout << p[i][j] << " ";
        }
        cout << endl;
    }
    _getch();
    return 0;
} 

这是我的代码,它是为方形矩阵而制作的。问题是,我无法在第二次读取文件以将数字保存到矩阵中。

2 个答案:

答案 0 :(得分:1)

您的代码中存在很多问题。一个重要的是你有几个无限循环,甚至不读取文件。更大的问题是你没有使用C ++结构。我编写了一个小程序,使用更多C ++概念来完成您正在尝试做的事情。在这种情况下,您应该使用std::vector - 他们将为您处理所有动态大小调整。

test.cc

#include <iostream>
#include <vector>
#include <sstream>
#include <fstream>
#include <string>

// Nobody wants to write `std::vector<std::vector<int>>` more than once 
using int_matrix = std::vector<std::vector<int>>;

void populate_matrix(int_matrix& mat, const std::string& line) {
  int num;
  std::stringstream ss(line);
  std::vector<int> row;
  // Push ints parsed from `line` while they still exist
  while(ss >> num) {
    row.push_back(num);
  }
  // Push the row into the matrix
  mat.push_back(row);
}

// This is self-explanatory, I hope
void print_matrix(const int_matrix& mat) {
  size_t n = mat.at(0).size(); 
  for(size_t i = 0; i < n; ++i) {
    for(size_t j = 0; j < n; ++j) {
      std::cout << mat.at(i).at(j) << " ";
    }
    std::cout << std::endl;
  }
}

int main(int argc, char** argv) {
  int_matrix mat;

  // Pass the file as a command-line arg. Then you don't need to worry about the path as much.
  if(argc != 2) {
    std::cout << "Number of arguments is wrong\n";
    return EXIT_FAILURE;
  }

  // Open file with RAII  
  std::ifstream fin(argv[1]);

  std::string line;
  // Handle each line while we can still read them
  while(std::getline(fin, line)) {
    populate_matrix(mat, line);
  }

  print_matrix(mat);

  return EXIT_SUCCESS;
}

此代码假定文本文件如下所示:

numbers.txt

1 2 3 
4 5 6 
7 8 9 

n行,每行有n个数字,用空格分隔。

要编译并运行此代码,您可以按照以下步骤操作:

13:37 $ g++ test.cc -std=c++14
13:37 $ ./a.out /path/to/numbers.txt 

答案 1 :(得分:1)

据我所知,程序在文件中运行一次,然后运行另一个while循环来从文件中读取。当您从文件中读取时,它就像您的&#34;光标&#34;前进。所以基本上,如果你到了最后,你必须将光标重置回文件的开头。

您可以使用seekg(0)。(http://www.cplusplus.com/reference/istream/istream/seekg/

将光标设置回来