从.txt文件中获取混合数字值

时间:2014-05-30 23:17:22

标签: c++ iostream ifstream

我试图为一个类创建一个程序,该程序可以将整数,整数/单元或num / denom的数字读入矩阵。该文件的格式始终是第一行中的row和col作为前两个值。之后,文件可以有不同类型的数字,例如,这是我当前的txt文件:

2 2 
1 1/2 2 1/4
3 1/3 4 1/5

首先,我找到了行和col:

in >> row >> col;

使用这个结构:

struct mixedNumber
{
    int whole, num, denom;
    void output();
};

我创建了一个动态数组:

mixedNumber* matrix[row];
for(int i = 0; i < row; i++)
    matrix[i] = new mixedNumber[col];

现在我遇到麻烦的部分是找到输入的哪些部分是混合数字的哪些部分。对于我的例子,这很简单,现在我正在使用这个函数:

void fillMatrix(mixedNumber *matrix[], ifstream &in, int row, int col)
{
    char junk;
    for(int i = 0; i < row; i++)
        for(int j = 0; j < col; j++)
            in >> matrix[i][j].whole >> matrix[i][j].num >> junk >> matrix[i][j].denom;
}

只有在txt文件中每个位置总有三个数字时才有效。 但是具有不同数字类型的txt文件,如:

2 3
1 1/2 2 1/2
1 1/4 2/3 3

无法正确阅读,说实话,即使看到它的数字也几乎不可能告诉它:

[(1) (1/2) (2 1/2)]
[(1 1/4) (2/3) (3)] 

甚至有可能这样做吗?或者需要存在像[0 1/2 1 0/1]这样的占位符零或每个数字周围的括号来说明数字的含义。

1 个答案:

答案 0 :(得分:1)

可悲的是,你不可能做你想做的事。

只是因为这种格式不明确。

e.g。矩阵如下

1 3
1 1/2 1 1/2

可能代表......

[(1), (1/2), (1 1/2)]

...或

[(1 1/2), (1), (1/2)]

根据您的格式无法消除歧义。

您必须添加零或找到另一种消除歧义的方法,例如使用逗号

e.g。

1 3
1, 1/2, 1 1/2

基本上你需要两个分隔符。

另一种选择

另一种常用的替代方法是用换行符分隔每个数字。你看,如果要写下文件中每个矩阵的数字,那么你不必把它写成行。

这样的矩阵
2 3
1 1/2 1 1/2
2 1/2 3 1/2

也可以表示为

2 3
1
1/2
1 1/2
2 1/2
3
1/2

这种格式不会含糊不清。您只需浏览数字流并按行填充矩阵。