解析矩阵文件时遇到了一些麻烦。看起来像这样:
# 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]。
有什么想法吗?我会非常感激的。 ; - )
答案 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]