从文件创建二维数组的麻烦

时间:2011-01-28 17:15:24

标签: c++ arrays multidimensional-array

解析矩阵文件时遇到了一些麻烦。看起来像这样:

#  Matrix made by matblas from blosum62.iij 
#  * column uses minimum score 
#  BLOSUM Clustered Scoring Matrix in 1/2 Bit Units 
#  Blocks Database = /data/blocks_5.0/blocks.dat 
#  Cluster Percentage: >= 62 
#  Entropy =  0.6979, Expected =  -0.5209 
  A  R  N  D  C  Q  E  G  H  I  L  K  M  F  P  S  T  W  Y  V  B  Z  X  * 
A  4 -1 -2 -2  0 -1 -1  0 -2 -1 -1 -1 -1 -2 -1  1  0 -3 -2  0 -2 -1  0 -4 
R -1  5  0 -2 -3  1  0 -2  0 -3 -2  2 -1 -3 -2 -1 -1 -3 -2 -3 -1  0 -1 -4 
N -2  0  6  1 -3  0  0  0  1 -3 -3  0 -2 -3 -2  1  0 -4 -2 -3  3  0 -1 -4 
D -2 -2  1  6 -3  0  2 -1 -1 -3 -4 -1 -3 -3 -1  0 -1 -4 -3 -3  4  1 -1 -4 
C  0 -3 -3 -3  9 -3 -4 -3 -3 -1 -1 -3 -1 -2 -3 -1 -1 -2 -2 -1 -3 -3 -2 -4 
Q -1  1  0  0 -3  5  2 -2  0 -3 -2  1  0 -3 -1  0 -1 -2 -1 -2  0  3 -1 -4 
E -1  0  0  2 -4  2  5 -2  0 -3 -3  1 -2 -3 -1  0 -1 -3 -2 -2  1  4 -1 -4 
G  0 -2  0 -1 -3 -2 -2  6 -2 -4 -4 -2 -3 -3 -2  0 -2 -2 -3 -3 -1 -2 -1 -4 
H -2  0  1 -1 -3  0  0 -2  8 -3 -3 -1 -2 -1 -2 -1 -2 -2  2 -3  0  0 -1 -4 
I -1 -3 -3 -3 -1 -3 -3 -4 -3  4  2 -3  1  0 -3 -2 -1 -3 -1  3 -3 -3 -1 -4 
L -1 -2 -3 -4 -1 -2 -3 -4 -3  2  4 -2  2  0 -3 -2 -1 -2 -1  1 -4 -3 -1 -4 
K -1  2  0 -1 -3  1  1 -2 -1 -3 -2  5 -1 -3 -1  0 -1 -3 -2 -2  0  1 -1 -4 
M -1 -1 -2 -3 -1  0 -2 -3 -2  1  2 -1  5  0 -2 -1 -1 -1 -1  1 -3 -1 -1 -4 
F -2 -3 -3 -3 -2 -3 -3 -3 -1  0  0 -3  0  6 -4 -2 -2  1  3 -1 -3 -3 -1 -4 
P -1 -2 -2 -1 -3 -1 -1 -2 -2 -3 -3 -1 -2 -4  7 -1 -1 -4 -3 -2 -2 -1 -2 -4 
S  1 -1  1  0 -1  0  0  0 -1 -2 -2  0 -1 -2 -1  4  1 -3 -2 -2  0  0  0 -4 
T  0 -1  0 -1 -1 -1 -1 -2 -2 -1 -1 -1 -1 -2 -1  1  5 -2 -2  0 -1 -1  0 -4 
W -3 -3 -4 -4 -2 -2 -3 -2 -2 -3 -2 -3 -1  1 -4 -3 -2 11  2 -3 -4 -3 -2 -4 
Y -2 -2 -2 -3 -2 -1 -2 -3  2 -1 -1 -2 -1  3 -3 -2 -2  2  7 -1 -3 -2 -1 -4 
V  0 -3 -3 -3 -1 -2 -2 -3 -3  3  1 -2  1 -1 -2 -2  0 -3 -1  4 -3 -2 -1 -4 
B -2 -1  3  4 -3  0  1 -1  0 -3 -4  0 -3 -3 -2  0 -1 -4 -3 -3  4  1 -1 -4 
Z -1  0  0  1 -3  3  4 -2  0 -3 -3  1 -1 -3 -1  0 -1 -3 -2 -2  1  4 -1 -4 
X  0 -1 -1 -1 -2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -2  0  0 -2 -1 -1 -1 -1 -1 -4 
* -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 -4  1

它是更大程序的一部分,但首先我想在将它放入类之前单独检查它。所以我的代码看起来像这样:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

char readfile(char * file)
{
    int lines, cols;
    char matrix[30][30];
    ifstream ifs(file, ios::in);
    ifs.precision(2);
    ifs.setf(ios::fixed, ios::showpoint);
    ifs >> matrix[lines][cols];
    while(!ifs.eof())
    {
        string linijka;
        getline(ifs, linijka);
        if (linijka[0] != '#')
        {
            for (lines = 0; lines < 30; lines++)
            {
                for (cols = 0; cols < 30; cols++)
                {
                    return matrix[lines][cols];
                }
            }
        }
    } 

    ifs.close();
}

int main(int argc, char * argv[1])
{
    cout << "Matrix:\n" << readfile(argv[1]) << endl;
    return 0;
}

编译时没有错误。不幸的矩阵是空的。执行后我收到了这样的话:

mateusz@viking:$ ./matpars submat/BLOSUM62.txt 
Matrix:

我需要它从细胞e获得标记。 G。 [T] [G]。

有什么想法吗?我会非常感激的。 ; - )

3 个答案:

答案 0 :(得分:3)

你的代码中有一个基本问题:一旦它到达那个return语句,函数就会结束,你的文件的其余部分将不会被解析。

这就是你没有看到任何东西的原因;它只打印文件第一行中的第一个字符,恰好是第一个A列标记之前的空白区域。

编辑:实际上,仔细观察,似乎有一个更重要的问题。您似乎期待第一个ifs >> matrix行将整个文件加载到数组中,而这是行不通的。

你似乎是一个初学程序员。说实话,我建议你从比C ++更简单的语言开始,比如Python或Ruby。

答案 1 :(得分:2)

有几个问题。正如已经提到的,你 从嵌套循环的中间返回:当然不是什么 你想做什么。此外,在循环之前,您会读到 matrix [lines] [cols]:这是未定义的行为,因为你已经 永远不会初始化行和列。 (通常,你甚至不会 将它们定义为for,例如:     for(int lines = 0; lines&lt; 30; ++ lines)         for(int cols = 0; cols&lt; 30; ++ cols) 。)但是,该行在语法上是有效的,并且读取第一行 来自输入的非空白字符(在您的情况下,是最初的#)。 并把它写在某个地方,虽然这是任何人猜测的地方。

其他一些评论:   - readfile的参数应该是char const *,而不是     字符*。甚至是std :: string const&amp;。

- 我不确定你要在矩阵中读到什么:     30的定义来自哪里?不应该     它是“int matrix [x] [x]”,或者沿着那些方向的东西。     或者更可能是:“std :: vector&gt;”。

- 你正在读整数(或者写成一个字符);     精度没有影响。它对输入也没有影响。

- 什么是“ifs.setf(ios :: fixed,ios :: showpoint)”     去做。 (碰巧的是,它几乎可以确定     浮点格式为其默认值 - 而不是固定---,     虽然我认为这种行为是正式未定义的。)不是     这很重要;这些标志对输入也没有影响。

- “while(!ifs.eof())”也肯定是错误的。该     表达式ifs.eof()仅在输入后可靠     操作失败。

此外,您需要对第一个进行一些特殊处理 非评论行,以及第一个特殊处理 每行中的字符。

- 詹姆斯坎泽

答案 2 :(得分:1)

我觉得这是家庭作业,所以我不想直接为你解决。 :-)然而,为了帮助你,这是一个用C ++ ish风格编写的Python实现:

#!/usr/bin/python

import sys

def readfile(fname):
  # A dynamic array; a similar thing in C++ is vector<int>.
  # If you want a two-dimensional dynamic array in C++, it's a vector< vector<int> >
  # It's not as efficient as a fixed-size C-style array, but much more convenient!
  mat = []
  fh = file(fname)

  for line in fh: # Read through the file line by line
    cells = line.split() # This is an array of all the items in this line

    # Skip blank lines, and comment lines that start with the hash symbol
    if len(cells) == 0 or cells[0] == '#':
      continue 

    # Skip lines that end with * (lets us avoid the column titles line)
    if cells[len(cells)-1] == "*":
      continue

    # Add a row to the matrix, in C++ it would be something like mat.push_back(vector<int>())
    mat.append([])

    # Add all the items except the first one as numbers
    for i in range(1, len(cells)): # Equivalent to C++'s "for (int i = 1; i < cells.size; ++i) { }"
      mat[len(mat)-1].append(int(cells[i]))

  fh.close()
  return mat

mat = readfile(sys.argv[1])
print "Cell at 3,4 is %u" % mat[3][4]