| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 462 人关注过本帖
标题:求帮忙解决一下字符串前后翻转问题!
只看楼主 加入收藏
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
结帖率:93.94%
收藏
已结贴  问题点数:20 回复次数:6 
求帮忙解决一下字符串前后翻转问题!
#include"stdio.h"
#include"stdlib.h"           
FILE *in,*out;
void main()              
{         
 int i=0,sum;
 static char zifu,str[55000000];
 in=fopen("F:\\寻找内含子序列\\内含子串联负序列.txt","rt");        //第12行
 out=fopen("F:\\寻找内含子序列\\收获1.txt","wt");     
 while(!feof(in))
 {
   str[i]=fgetc(in);
   i++;
 }
 for(i=0;i<SUM 2;i++)
    {
       zifu=str[i];
       str[i]=str[sum-1-i];
       str[sum-1-i]=str[i];     //第一个与最后一个、第二个与倒数第二个等替换   
    }
  for(i=0;i<SUM;I++)
   {
      if(str[i]=='A')
      {
       str[i]='T';
       continue;     //加continue表明完成操作后继续循环,不执行下面的;要加{}否则不管第一个if是否成立执行continue继续循环
      }
      if(str[i]=='T')
      {
       str[i]='A';
       continue;
      }
      if(str[i]=='C')
      {
       str[i]='G';
       continue;
      }
      if(str[i]=='G')
      str[i]='C';
   }
    sum=i;
  for(i=0;i<SUM;I++)
  fputc(str[i],out);
  fclose(in);
  fclose(out);

}
内含子串联负序列.rar (762.61 KB)

 上面的程序用来把文件中2813952个碱基长的字符串前后翻转一下,即第一个成最后一个,最后一个成第一个等,翻转过来之后,在对所有字符进行A换成T、T换成A、C换成G、G换成C的操作。
但现在程序运行不畅,总有小问题,同时运行很慢
搜索更多相关主题的帖子: 倒数 内含子 字符串 include 
2013-07-04 13:49
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:20 
这么小的文件,一次就可以读进内存,连分组处理都不需要
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int main()
{
    char* p = NULL; // 存储文件内容
    long len = 0L; // 文件长度
    {
        FILE* fi = fopen( "内含子串联负序列.txt", "rb" );
        if( !fi )
        {
            printf( "%s\n", "[ERROR] 文件读取失败." );
            return 1;
        }

        // 获取文件长度
        fseek( fi, 0L, SEEK_END );
        len = ftell( fi );
        fseek( fi, 0L, SEEK_SET );

        // 分配需要的内存
        p = malloc( len );
        if( !p )
        {
            printf( "%s\n", "[ERROR] 内存分配失败." );
            fclose(fi);
            return 2;
        }

        // 读取文件内容
        fread( p, 1, len, fi );
        fclose(fi);
    }

    // 处理
    {
        FILE* fo = fopen( "收获1.txt", "wb" );
        if( !fo )
        {
            printf( "%s\n", "[ERROR] 文件创建失败." );
            free( p );
            return 3;
        }

        for( long i=0; i<len; ++i )
        {
            // A换成T、T换成A、C换成G、G换成C
            char c  = p[len-i-1];
            switch( c )
            {
            case 'A': c='T'; break;
            case 'C': c='G'; break;
            case 'G': c='C'; break;
            case 'T': c='A'; break;
            default:
                printf( "%s\n", "[ERROR] 操蛋呀,既然有ACGT之外的字符." );
            }

            fputc( c, fo );
        }

        fclose(fo);
    }

    free( p );

    return 0;
}

2013-07-04 15:02
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 2楼 rjsp
您好,首先谢谢您的帮助!另外想问一下,运行后出现了下述错误提示,我尝试改了改,总不对,所以又要麻烦您了,谢谢!!!
error C2440: '=' : cannot convert from 'void *' to 'char *'
        Conversion from 'void*' to pointer to non-'void' requires an explicit cast
执行 cl.exe 时出错.

还有,这个程序在字符串长度为几千万甚至几亿时能运行吗?另外字符串的前后翻转是那部分完成的呀,是那三个fseek吗?
谢谢!!!
2013-07-05 12:09
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 2楼 rjsp
不好意思,忘了说明字符串中还有N字符,当然这个字符只需要按位置前后翻转就行了,它不用再进行A换成T的那种转换。
谢谢!!
2013-07-05 12:13
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
以下是引用zhou31146001在2013-7-5 12:09:26的发言:

error C2440: '=' : cannot convert from 'void *' to 'char *'
这说明,你用的不是C语言
在C语言标准中,void* 可隐式转化为 任何类型指针
下次,你在『C语言论坛』中要的却不是『C语言代码』,你应该明确的说出来,否则鬼才能知道
2013-07-05 12:32
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 5楼 rjsp
你好,我使用vc6.0运行的程序,这个是适合C语言的吧!如果像您说的那样,应该怎么改呀?非常谢谢!!!
2013-07-05 12:59
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
你好,大侠,我写的那个程序,即一楼的那个程序是用C写的,另外我又写了一个,作用跟那个是一样的,有些地方也不完善,请您指教!!
#include"stdio.h"
#include"stdlib.h"           
FILE *in,*out;
int main()              
{         
 long int i,sum=52248967;
 static char str[55000000];
 char zifu;
 in=fopen("F:\\寻找内含子序列\\内含子串联负序列.txt","rb");        //第12行
 out=fopen("F:\\寻找内含子序列\\收获1.txt","wb");     
 fgets(str,sum+1,in);
 for(i=0;i<sum/2;i++)
    {
       zifu=str[i];
       str[i]=str[sum-1-i];
       str[sum-1-i]=str[i];     //第一个与最后一个、第二个与倒数第二个等替换   
    }
   for(i=0;i<sum;i++)
   {
      if(str[i]=='A')
      {
       str[i]='T';
       continue;     //加continue表明完成操作后继续循环,不执行下面的;要加{}否则不管第一个if是否成立执行continue继续循环
      }
      if(str[i]=='T')
      {
       str[i]='A';
       continue;
      }
      if(str[i]=='C')
      {
       str[i]='G';
       continue;
      }
      if(str[i]=='G')
      str[i]='C';
   }
  fputs(str,out);
  fclose(in);
  fclose(out);
}
2013-07-05 13:04
快速回复:求帮忙解决一下字符串前后翻转问题!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022036 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved