从锯齿状阵列中读取

时间:2018-05-05 23:26:22

标签: c++

我目前正在使用锯齿状数组,我对它们有一些问题。我的类当前读取一个txt文件,然后将该数据转换为输出文件。

注意:我的班级不使用矢量,所以请不要提供涉及它们的代码。我知道它们更有效/更简单(至少这是我读到的)但我还没达到那个水平。另外,writeJaggedArrayToFile是空的,这是因为我还没有做任何事情。

目前,我正在使用“inputF>> rowIndex>> temp>> rowLen>> temp;”访问行索引和列长度。 Temp被用作填充变量来忽略“#”。有没有办法提取数据而不创建像temp这样的变量并填充内存。我尝试用getline()创建字符串,但#不是每个数字之间的分隔符,然后我必须将数字重新转换回整数而不是字符串。

另外,我的教授给了我们几行代码,例如:

int **A = new int*[numRow];
numColumns = new int[numRow];

我不完全了解这些是如何工作的。新的int被用作指针我相信但是如何?

#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>
using namespace std;

class ReadAndWriteJaggedArray {

private:

    int numRow; // the number of rows in the jagged array, update this when 
you read the file
    int *numColumns; // the number of columns in each row of the jagged array, update this when you read the file

public:

    ~ReadAndWriteJaggedArray() {
    delete numColumns;
    }

    int **fileJaggedArray() {
        numRow = 0;
        ifstream inputF;
        inputF.open("jaggedArrayInput.txt");

        if(!inputF.is_open()){
            cout << "Error: Unable to open file." << endl;
            exit(EXIT_FAILURE);
        }

        inputF >> numRow;

        int **A = new int*[numRow];
        numColumns = new int[numRow];

        for(int i=0;i<numRow;i++){
            int rowIndex;
            int rowLen;
            char temp;

            inputF >> rowIndex >> temp >> rowLen >> temp;
            numColumns[rowIndex] = rowLen;
            A[rowIndex] = new int[rowLen];

            for(int j=0;j<rowLen;j++){
            inputF >> A[rowIndex][j];
            }
        }

        inputF.close();
        return A;
    }

    void writeJaggedArrayToFile(int **A) { 

    }
};

int main() {
    ReadAndWriteJaggedArray jaf;
    int **jaggedArray = jaf.fileJaggedArray();
    jaf.writeJaggedArrayToFile(jaggedArray);
    delete jaggedArray;
    return 0;
}

我正在使用的文本文件:

6
0 # 3 # 5 7 1
1 # 2 # -14 9
2 # 4 # 9 1 0 4
3 # 1 # -27
4 # 5 # 9 10 -7 45 12
5 # 4 # 99 1 14 -881

1 个答案:

答案 0 :(得分:-1)

以下是处理锯齿状数据的更为范式化方法的快速示例。

请注意,每列的大小都存储在实际的std::vectors中。而不是非范例和容易出错的C方式保持容器(指针)与预期大小同步。

#include <vector>
#include <iostream>
std::vector<std::vector<int>> jagged_data;

int main()
{
    auto rows = 9;
    for (auto row = 0; row < rows; ++row)
    {
        jagged_data.push_back(std::vector<int>());
        jagged_data[row].resize(row, row);
    }
    jagged_data.back().resize(4);//mess up the last one as an example.
    for (const auto& row : jagged_data)
    {
        for (const auto& data_at_column : row)
        {
            std::cout << data_at_column << " ";
        }
        std::cout << std::endl;
    }
    return 0;
}

打印

1
2 2
3 3 3
4 4 4 4
5 5 5 5 5
6 6 6 6 6 6
7 7 7 7 7 7 7
8 8 8 8