我必须从文件中读取一个未知大小的数字数组并将其保存为矩阵。代码必须尽可能紧凑,这就是为什么我不想将文件作为字符串读取然后将其转换为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;
}
这是我的代码,它是为方形矩阵而制作的。问题是,我无法在第二次读取文件以将数字保存到矩阵中。
答案 0 :(得分:1)
您的代码中存在很多问题。一个重要的是你有几个无限循环,甚至不读取文件。更大的问题是你没有使用C ++结构。我编写了一个小程序,使用更多C ++概念来完成您正在尝试做的事情。在这种情况下,您应该使用std::vector
- 他们将为您处理所有动态大小调整。
#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;
}
此代码假定文本文件如下所示:
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/)