Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++如何从文本文件中扫描二维数组并对行进行求和?_C++ - Fatal编程技术网

C++如何从文本文件中扫描二维数组并对行进行求和?

C++如何从文本文件中扫描二维数组并对行进行求和?,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

文件信息:

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

011010101017


如何实现这一点?

我认为您的主要问题在于您对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;