【问题标题】:Getting mixed number values from a .txt file从 .txt 文件中获取混合数值
【发布时间】:2014-07-20 19:26:23
【问题描述】:

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

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

所以首先我使用以下方法找到行和列:

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 个结果:如果有 1 个或更多,则得到 n+1 个结果。
  • 是的,我最初的想法是使用 stringstream 将它拆开并检查它。但我认为区分(1 1/2)和(1)(1/2)之类的东西太模糊了。不过谢谢,现在我知道我应该停止尝试做一些无法完成的事情。
  • @Aloof 我为答案添加了另一种选择。尽管您可能只是想确认这种格式确实是模棱两可的。

标签: c++ iostream ifstream


【解决方案1】:

遗憾的是,您无法按照自己的意愿行事。

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

例如如下所示的矩阵

1 3
1 1/2 1 1/2

可以代表...

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

或者...

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

而且没有办法根据您的格式消除歧义。

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

例如

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

而且这种格式不会有歧义。您只需遍历数字流并逐行填写矩阵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多