-1

我的问题是这样的:我必须读取一个包含一些字符串的文件。任务是在 C 程序中读取数据并存储在适当的数据结构中。

目前我的程序打印所有值,但访问这些变量是一个问题......

using namespace std;

int split(char* str, char splitstr[15][10]);
int main ()
{ 
  FILE *fp;

  char str[20] = {0}; // temp variable for accessing a line from file

 // for opening of file

  fp = fopen("C:\\Cross Crystal Sheet.csv", "r") ;

  char input[256];
  char result[15][10];
  char *protein[700];
  char p[1000];
  int j=0;

  if (NULL != fp) 
  {

    while(fgets(str,sizeof(str),fp)!=NULL)
    {
      strcpy(input, str);
      int count = split(input, result);
      int tmp=count;
      //j=result[0]-'0';
      for (int i=0; i<count; i++) 
      { 
        printf("%s\n", result[i]);
        //printf("%s\n",*(result+i));

        protein[j]=*(result+i);
          //*((protein)+j);
        printf("%s \n",*(protein+j));
        j++;
      }


     }

    }

}

int split(char* str, char splitstr[15][10])
{
   char* p;
   int i=0;
   char *string = strdup(str);
   p = strtok (string, ",");
  // i=i+count;

   while(p!=NULL)
   {
       strcpy(splitstr[i++], p);
       p = strtok (NULL, ",");

       if( p ==NULL)
        {
         break;
        }
     unsigned charlength = strlen(p);
     if(charlength==1 ||charlength==2 )
        {
          break;
        }
   }
   return i;
}

我期待像这样的蛋白质 []={1,ABL1,ABL2,AURKA,AURKB,...}

数据文件是这样的:

1,ABL1,ABL2,,,,
,,AURKA,,,,
,,AURKB,,,,
,,BMX,,,,
,,BTK,,,,
,,KIT,,,,
,,LCK,,,,
,,MAPK14,,,,
,,PRKACA,,,,
,,SYK,,,,
,,EGFR,,,,
,,INSR,,,,
,,MAPK11,,,,
,,,,,,
2,ABL2,ABL1,,,,
,,AURKA,,,,
,,AURKB,,,,
,,CAMK4,,,,
,,CDKL2,,,,
,,CLK3,,,,
,,CSNK1G3,,,,
,,KIT,,,,
,,LCK,,,,
,,MAPK14,,,,
,,PRKACA,,,,
,,SLK,,,,
,,SYK,,,,
,,,,,,
3,ACVR1,ACVR2A,,,,
,,ACVRL1,,,,
,,PIM1,,,,
,,PRKAA2,,,,
,,,,,,
4,ACVR2A,ACVR1,,,,
,,CAMK2D,,,,
,,MST4,,,,
,,PRKAA2,,,,
,,SLK,,,,
,,,,,,
5,AKT1,PRKACA,,,,
,,,,,,
,,,,,,
6,ALK,FES,,,,
,,MET,,,,
,,,,,,
7,AURKA,ABL1,,,,
,,ABL2,,,,
,,AURKB,,,,
,,CDK2,,,,
,,CHEK1,,,,
,,PLK1,,,,
,,PRKACA,,,,
,,,,,,
8,AURKB,ABL1,,,,
,,ABL2,,,,
,,AURKA,,,,
,,PRKACA,,,,
,,,,,,
9,BMX,ABL1,,,,
,,BTK,,,,
,,LCK,,,,
,,MAPK14,,,,
,,,,,,
10,BRAF,CDK8,,,,
,,KDR/VEGFR2,,,,
,,MAPK14,,,,
,,RAF,,,,
,,,,,,
4

3 回答 3

1

根据您的代码,我认为问题在于您没有为“蛋白质 []”分配内存,您应该为蛋白质的每个索引分配内存以存储您的字符串。其次,将字符串从一个地方复制到花药不仅仅是像这样的简单任务:

protein[j]=*(result+i);

使用strncpy来做到这一点。以上都是我对你的问题的分析。

于 2012-06-19T12:06:04.223 回答
0

我已经解决了这些问题。下面是我的代码。请建议显示我可以使此代码更通用。

using namespace std;

int split(char* str, char splitstr[16][11]);

int main ()
{ 
  FILE *fp;
  char str[20] = {0}; 
  fp = fopen("C:\\Cross Crystal Sheet.csv", "r") ;

  char input[256];
  char s[619][15];
  string str2, str3;
  char result[16][11];
  int j=0;
  if (NULL != fp) 
       {
            while(fgets(str,sizeof(str),fp)!=NULL)
             {
                strcpy(input, str);
                int count = split(input, result);
                int tmp=count;

                for (int i=0; i<count; i++) 
                   { 
                      str2 = result[i]; // "generalities"
                      char * cstr;
                      cstr = new char [str2.size()+1];
                      strcpy (cstr, str2.c_str());
                      strcpy (s[j], cstr);
                      j++;
                   }

             }
       }

   char ss[10] ={0};
   printf("Enter any main string to find \n");
   scanf("%10s",ss);
 //  printf("%d \n",atoi(s[16]));

  int temp=0;
  for (int k=0;k<j;k++)
  { 
       if (strncmp(s[k],ss,8)!=0)
         {
           temp=k; 
         }
       else
         {  
           int x=0;
           x=atoi(s[k-1]);
           if(x >=1 && x <=95)
            {
               printf("found at %d \n",k);
                    for(k=k;k<k+15;k++)
                        {
                          if (strncmp(s[k],"\n",2)!=0)
                             {
                              printf("%s \n",s[k]);
                             }
                          else
                             {
                              return 0;
                             }
                       }
             }
             else

         {
                 continue;
             }
            }

         }
   }


int split(char* str, char splitstr[16][11])
{
   char* p;
   int i=0;
   char *string = strdup(str);
   p = strtok (string, ",");


   while(p!=NULL)
   {
       strcpy(splitstr[i++], p);
       p = strtok (NULL, ",");

       if( p ==NULL)
        {
         break;
        }
     unsigned charlength = strlen(p);
     if(charlength==1 ||charlength==2 )
        {
          break;
        }
   }
   return i;
}
=======
于 2012-06-22T19:29:32.460 回答
0

您的代码需要一行并将其存储在变量中result。然后你指定蛋白质指向result

循环的下一次迭代用下一行的内容for覆盖。result

可以静态声明一大块内存,但动态分配内存可能会更好,特别是如果您不知道输入文件的最大大小。

于 2012-06-19T15:03:07.690 回答