我有像ATGCCA这样的字符串.... 该字符串将转换为[ATG CCA ...]的char数组。 我已经知道ATG = 1且CCA = 2,我已将它们定义为double。如何将转换后的矩阵保存为double? 这是我的程序,但它不起作用:
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
using namespace std;
int main() {
double ATG=1, CCA=2;
fstream fp("sequence.txt",ios::in);
if(!fp)
{
cerr<<"File can not open!"<<endl;
exit(1);
}
char content,k,l,m;
char a[4]="";
double n;
while(fp>>k>>l>>m){
fp.read(a, sizeof(a) - 1);
n=atof(a);
cout<<a<<" "<<n<<endl;
}
}
我希望将此视为输出:
ATG 1
CCA 2
但我看到的是:
ATG 0
CCA 0
感谢您的帮助!
答案 0 :(得分:4)
变量ATG和CCA与您读入的任何字符无关系。
您可能希望将字符串与双打相关联,您需要Associative Container,例如std::map<std::string, double>
。
#include <iostream>
#include <fstream>
#include <string>
int main() {
std::map<std::string, double> lookup = { { "ATG", 1}, { "CCA", 2 } };
std::fstream fp("sequence.txt",std::ios::in);
if(!fp)
{
std::cerr<<"File can not open!"<<std::endl;
exit(1);
}
char content,k,l,m;
char a[4]="";
double n;
while(fp>>k>>l>>m){
fp.read(a, sizeof(a) - 1);
n=lookup[a];
std::cout<<a<<" "<<n<<std::endl;
}
}
答案 1 :(得分:1)
您似乎正在读取一个字符串"ATG"
,并且您希望atof
将其用作提取其值的变量的名称。在这种推理中有几个链式的错误。
您需要类似map
(代码未经过测试)的内容:
#include <map>
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
int main() {
map<string, double> amino;
amino["ATG"] = 1;
amino["CCA"] = 2;
// ... Complete with the other 62 codons
fstream fp("sequence.txt",ios::in);
if(!fp)
{
cerr<<"File can not open!"<<endl;
exit(1);
}
char content, k, l, m;
char a[4]="";
double n;
while(fp >> k >> l >> m) {
fp.read(a, sizeof(a) - 1);
n = amino[a];
cout << a << " " << n << endl;
}
return 0;
}
请注意,您可能希望使用int
而不是double
s。
也许一些检查以确保序列读取实际上是密码子。
您可能需要/想要使用array
作为地图对的键,请参阅
unsigned char array as key in a map (STL - C++)