2012-06-19 24 views
-1

我的問題是這樣的:我必須讀取包含一些字符串的文件。任務是讀取數據並將其存儲在C程序的適當數據結構中。可以打印但不能將字符串存儲到數組中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,,,, 
,,,,,, 
+1

這不是C.你的意思是C++或C#也許? – pmg

+0

您可以編輯您的問題以包含實際輸出(但不包括所有輸入文件)以及預期輸出。 –

+0

你必須檢查陣列尺寸 – Riskhan

回答

1

根據你的代碼,我認爲這個問題是你沒有爲「蛋白[]」分配內存,你應該分配內存蛋白的各項指標來存儲您的strings.Secondly,複製從一個地方到另一串不只是一個簡單的分配是這樣的:使用strncpy做that.All上述

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

是我的分析你的問題。

+0

'strncpy'的最初目的是將NUL終止的文件名字符串複製到早期UNIX文件系統的固定大小(14個字符)NUL填充字段中。這幾乎總是用於任何其他目的的錯誤工具。 –

+0

@JimBalter,爲什麼它幾乎總是錯誤的工具?它被用來避免溢出堆棧,許多常見的錯誤都是由'strcpy'引起的。 – MYMNeo

+0

我剛剛告訴你:它是NUL-pads,而不是NUL終止。當n == strlen(src)是一個乞求發生的bug時,NUL填充是浪費時間並且缺少NUL終止。附:你可以通過檢查本網站來回答這個問題:http://stackoverflow.com/questions/869883/why-is-strncpy-insecure –

0

您的代碼佔用一行並將其存儲在變量result中。 然後,您將蛋白質分配到result

for循環的下一次迭代將用下一行的內容覆蓋result

可以靜態聲明一大塊內存,但它可能會更好地動態分配內存,特別是如果您不知道輸入文件的最大大小。

+0

感謝所有我已經解決的問題。下面是我的編 – user1131484

0

我已解決問題。以下是我的代碼。請建議show我可以使這個代碼更通用。

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; 
} 
======= 
相關問題