проблема с созданием двухмерного массива из файла - PullRequest
1 голос
/ 28 января 2011

У меня проблемы с файлом матрицы разбора.Это выглядит примерно так:

#  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:

Мне нужно, чтобы получить оценку из ячейки, например [T] [G].

Есть идеи?Я буду очень благодарен.; -)

Ответы [ 3 ]

3 голосов
/ 28 января 2011

В вашем коде есть фундаментальная проблема: как только он достигнет этого оператора возврата, функция завершится, а остальная часть вашего файла не будет проанализирована.

Вот почему вы ничего не видите; он печатает первый символ ТОЛЬКО в первой строке вашего файла, и это оказывается пробелом перед первым маркером столбца А.

РЕДАКТИРОВАТЬ : На самом деле, если присмотреться, кажется, что есть более существенная проблема. Похоже, вы ожидаете, что первая строка ifs >> matrix загрузит весь файл в массив для вас, чего он не может сделать.

Вы, кажется, начинающий программист. Если честно, я бы порекомендовал вам начать с более простого языка, чем C ++, такого как Python или Ruby.

2 голосов
/ 28 января 2011

Есть несколько проблем.Как уже упоминалось, вы возвращаетесь из середины вложенного цикла: конечно, не то, что вы хотите сделать.Кроме того, перед циклом вы читаете в матрицу [lines] [cols]: это неопределенное поведение, так как вы никогда не инициализировали строки и столбцы.(Как правило, вы даже не определяете их, пока в for, например: for (int lines = 0; lines <30; ++ lines) for (int cols = 0; cols <30; ++ cols).) Тем не менеестрока является синтаксически верной и читает первый непустой символ из ввода (в вашем случае, начальный #).И записывает это где-то, хотя никто не знает, где. </p>

Некоторые дополнительные комментарии: - Аргумент readfile должен быть char const *, а не char *.Или даже std :: string const &.

- я не уверен, что вы пытаетесь прочитать в матрице: откуда взялись 30 в своем определении?И не должно ли это быть "int matrix [x] [x]" или что-то в этом роде.Или, более вероятно: "std :: vector>".

- вы читаете целые числа (или как написано, один символ);точность не влияет.Это также не влияет на ввод.

- И что должен делать ifs.setf (ios :: fixed, ios :: showpoint).(Как это бывает, он почти наверняка устанавливает формат с плавающей запятой по умолчанию - а не фиксированный - хотя я думаю, что поведение формально не определено.) Не то чтобы это имеет значение;эти флаги также не влияют на ввод.

- "while (! ifs.eof ())" также определенно неверно.Выражение ifs.eof () надежно только после операция ввода завершилась неудачно.

Кроме того, вам понадобится специальная обработка для первой строки без комментариев и некоторые специальныеобработка первого символа в каждой строке.

- Джеймс Канзе

1 голос
/ 28 января 2011

У меня такое ощущение, что это домашняя работа, поэтому я не хочу решать ее для вас. :-) Тем не менее, чтобы помочь вам, вот реализация Python, написанная в стиле C ++:

#!/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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...