C++如何从文本文件中扫描二维数组并对行进行求和?
文件信息: 610 011011011 0110 0 0 1 1 1 0 01101101101 011011011 01101101101101 剧本: 现在,当我测试这个文件时,编译它,没有错误,但是我得到了这个 结果: 011010117 011010117 011010117 011010117 011010117 011010117 现在,为什么它会重复? 我哪里做错了? 我做得对吗?试图总结一下 想要的结果是: 011010117 011108 01 11 10 7 0110101017 011018 011010101017C++如何从文本文件中扫描二维数组并对行进行求和?,c++,C++,文件信息: 610 011011011 0110 0 0 1 1 1 0 01101101101 011011011 01101101101101 剧本: 现在,当我测试这个文件时,编译它,没有错误,但是我得到了这个 结果: 011010117 011010117 011010117 011010117 011010117 011010117 现在,为什么它会重复? 我哪里做错了? 我做得对吗?试图总结一下 想要的结果是: 011010117 011108 01 11 10 7 01101010
如何实现这一点?我认为您的主要问题在于您对2d阵列的声明:
int masyvas[x][y];
x和y在编译时是未知的,您需要使用动态内存分配,使用类似std::vector的方法,或者将masyPass size设置为比您需要的更大的值:
int masyvas[100][100];
试试看。你的代码有一些问题。首先,x和y在行之前未初始化:
int masyvas[x][y]; // masyvas is 2D array
然后,当您读入数组时:
D >> masyvas[i][j];
使用i和j的索引范围为1到x和1到y。但是C/C++中的数组是基于0的,因此i和j的范围应该是0到x-1,0到y-1
我建议,使用循环方式和数组,而不是使用C++方式:容器向量和迭代器。 例如,您可以简单地使用
copy_n(istream_iterator<int>(input_data),
cols,
back_inserter(row));
这只是说cols整数从输入_数据中读取,然后附加到称为行的向量的后面
对于输出,您可以使用类似的技术:下一行表示将整个行向量复制到输出cout,以便在每两个元素之间有一个空格:
copy(row.begin(), row.end(),
ostream_iterator<int>(cout," "));
最后,为了计算一行的总数,我们可以使用函数acculate,它的作用是:
cout << accumulate(row.begin(), row.end(), 0) << "\n";
完整代码如下:
#include <iostream>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <numeric>
#include <vector>
int main(int argc, char *argv[])
{
using namespace std;
int rows, cols;
ifstream input_data("Duomenys.txt");
input_data >> rows >> cols;
for(int i = 0; i < rows; i++)
{
vector<int> row;
copy_n(istream_iterator<int>(input_data),
cols,
back_inserter(row));
copy(row.begin(), row.end(),
ostream_iterator<int>(cout," "));
cout << accumulate(row.begin(), row.end(), 0) << "\n";
}
return 0;
}
需要注意的几点:
在循环的“打印”中,您可以使用x来打印masyvas[x][j]。那不应该是带i的masyvas[i][j]吗?
<> C++中的数组从0开始,到AlalaySt- 1,但是for循环在索引1开始,然后转到AlaySeaSe+1。假设我编写一个for循环,如下所示:
int array[10] = {1, 2, 3, 5, 8, 13, 21, 34, 55, 89};
for (int x = 1; x < 10 + 1; x++) {
cout << array[10] << " " << endl;
}
我们使用0而不是1获取数组中的第一个索引。因此,它不是打印数组中的数字序列,而是从第1个索引2开始,一直到第11个索引超出范围并使我的程序崩溃
你的数组创建怎么没有给你编译器错误?它在我的身上。当你创建一个int时,C++不会把它初始化为0,所以你不知道它里面可能有什么。例如:
int x;
int y;
cout << x << ", " << y << endl;
这不适合我。它告诉我x包含-858993460。想象一下,尝试创建一个数组,将其作为其中一个大小。两个最基本的解决方案是使用新操作符的向量和动态数组
希望这有帮助。这在masyvas[x][y]中是不允许的;as x和y必须在编译时已知。我建议使用STD::除了C++代码之外,Voice不是一个脚本,你是否已经与调试器逐行逐行地执行代码?进行此操作时,您观察到了什么?您有一个“一个接一个”的错误。数组索引从0开始,一直到但不包括其大小。在用于分配存储之前为x和y赋值也非常有用。仅供参考,如果所有这些的全部目标都是简单地输出每行,格式化为read,然后求和,然后重复,在这段代码中根本没有理由使用任何数组或向量。只需读取大小信息,然后在处理每个“行”时,输出其值,完成后,输出一个累计总和和一个换行符。对每一行这样做,我想你就完成了。不要靠猜测来编程。使用防弹的东西,比如std::vector。。。。。然后你试着读一个101个元素大的文件,你的程序写得越界,然后就死了基于这个问题,他只是在学习基础知识。当然std::vector会更好,但我怀疑它超出了本任务的范围。如果X>100,那就做个助理或其他什么吧,因为他们对语言比较陌生,为什么要教他们坏习惯?教他们正确的做事方法,这样他们就不会养成坏习惯。公平地说,这对你们所有人都有帮助,但这很有帮助。@Eddge和user4581301我根据您的反馈更新了答案。谢谢。编辑得好。现在唯一要抱怨的是根本不需要向量,但它的使用是有教育意义的。@user4581301读取的整数需要打印和累加。除了在C++03中使用花哨的迭代器或在C++11中使用lambdas之外,我现在还不清楚如果没有中间容器该怎么办。感谢您的编辑,包含了很多有用的信息。
从我读到的问题来看,OP需要做的就是打印结果,所以对于每一行,都要进行读取、计算和打印。不需要存储。但正如我所写,这是一个很好的例子,说明了如何使用向量和可用的工具。
int x;
int y;
cout << x << ", " << y << endl;