虽然说C++标准非常高效规整,但是C标准有时却是解决问题的最快方法。
最开始时尝试用fstream 来打开文件,虽然能顺利打开并获取数据,但是遇到换行的时候却非常容易出错。
代码如下:
fstream file1;
file1.open("ecoli.txt",fstream::in | fstream:: out);
while(!file1.eof())
{
file1.getline(buf,100,'\n');
cout<<buf<<endl;
}
这样得到的每一行数据可能会和上一行重复(或者是我没学好这种用法,总之比较容易出问题或者内存溢出)。
无奈之下用了C的代码:
#include <stdio.h>
#include <string.h>
#define MAX_LINE 1024
int main(void)
{
char buf[MAX_LINE]; /* 缓冲区 */
FILE *fp;
int len;
if((fp = fopen("test.txt", "r")) == NULL)
{ /* 打开文件 */
perror("fail to read");
exit(1);
}
while(fgets(buf, MAX_LINE, fp) != NULL)
{ /* 每次读入一行 */
len = strlen(buf);
/* 输出所读到的字符画串,并将字符个数输出 */
buf[len - 1] = '\0'; /* 去掉换行符,这样其他的字符串函数就可以处理了 */
printf("%s %d\n", buf, len - 1); /* 使用printf函数输出 */
}
return 0;
}
这样才能顺利获得每一行的数据并保证没有错误。
另一个问题是蛋白质信息字符串的识别。最开始我想到的是快速匹配算法,但是这样效率并不高而且考虑到DIP-XXXXN这样的格式中XXXX的长度不定而且是变化的,所以打算用正则表达式类,也就是VS2008之后的版本带的 regex.h
文件Ecoli20111027.txt中的内容如下:
DIP-367N|refseq:NP_288037|uniprotkb:P07002 DIP-366N|refseq:NP_416120|uniprotkb:P07001
DIP-342N|refseq:NP_414931|uniprotkb:P13458 DIP-572N|refseq:NP_040618|uniprotkb:P03702
DIP-572N|refseq:NP_040618|uniprotkb:P03702 DIP-540N|refseq:NP_417297|uniprotkb:P08394
DIP-540N|refseq:NP_417297|uniprotkb:P08394 DIP-583N|refseq:NP_059594|uniprotkb:P11191
DIP-341N|refseq:NP_286213|uniprotkb:P12727 DIP-340N|refseq:NP_289122|uniprotkb:P15027
DIP-340N|refseq:NP_289122|uniprotkb:P15027 DIP-364N|refseq:NP_313068|uniprotkb:P02339
我们要得到的是一组DIP-数字N这样的字符串对,所以
识别公式为:
(DIP-[0-9]*N)(.*)(\t)(DIP-[0-9]*N)
如果结果存放在数组 res[] 中,则第一个 DIP-[0-9]*N 存放在res[1] ,第二个 DIP-[0-9]*N 存放在 res[4],程序可以直接调用。
可以得到获取DIP互作信息对的代码:
//获取DIP-XXXX互作用对
#include <stdio.h>
#include <iostream>
#include <regex>
#include <string>
#define MAX_LINE 1024
void main(void)
{
char buf[MAX_LINE]; /* 缓冲区 */
std::string str; //待匹配串
std::tr1::cmatch res; //捕获集合
FILE *fp;
int len;
if((fopen_s(&fp, "Ecoli20111027.txt", "r")) == NULL)
{ /* 打开文件 */
perror("fail to read");
}
while(fgets(buf, MAX_LINE, fp) != NULL)
{ /* 每次读入一行 */
len = strlen(buf);
str = buf;
std::tr1::regex rx("(DIP-[0-9]*N)(.*)(\t)(DIP-[0-9]*N)");
std::tr1::regex_search(str.c_str(), res, rx);
std::cout<<res[1]<<'.'<<res[4]<<std::endl;
}
}
输出结果如下图·:
修改于2012-03-02:增加Ecoli文件详情
===================================
本文来自:http://blog.youkuaiyun.com/zh405123507
tags:蛋白质 fasta 正则式 正则表达式
文章详细对比了C++和C标准在处理文件和蛋白质信息识别上的优劣,通过实例展示了如何使用C语言解决复杂问题,并提供了蛋白质信息识别的正则表达式解决方案。
601

被折叠的 条评论
为什么被折叠?



