-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;
}

この protein[]={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

コードは 1 行を取り、変数に格納しますresult。次に、ポイントするタンパク質を に割り当てますresult

ループの次の繰り返しでは、次の行の内容でfor上書きされます。result

大きなメモリ チャンクを静的に宣言することは可能ですが、特に入力ファイルの最大サイズがわからない場合は、メモリを動的に割り当てる方がよいでしょう。

于 2012-06-19T15:03:07.690 に答える
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 に答える