2013-11-21 52 views
-1

我試圖讀取結構中的以下製表符分隔文件,但獲取segmentation fault。我的代碼無法讀取值。在讀取c中的製表符分隔文件時出現'分段錯誤'

---- ---- exdata.txt

ID seq len 
082054 AAAG 4 
53948 AAAGGGATAGAAAAAACGAA 37 
53948 AAAGGGAGACTTTGGATAAGG 39 
253 ALFPGELDY 15 
085241 ASHHHHHH 23 
184152 ASAS 11 
184152 AGGSGASAS 16 
184152 AGGGSGASAS 21 
184152 AGGGSGASAS 26 
184152 AASGASAS 31 
184152 AAAGSGXSGASAS 13 

代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 


int main() 
{ 
    char field1[32], field2[32], field3[32]; 
    char *p; 
    int bufferSize =100; 
    FILE* infile_ptr = fopen("exdata.txt", "r"); 
    char line[bufferSize]; 

    while(fgets(line, bufferSize, infile_ptr) != NULL) 
    { 
     printf("%s", line); 
     p = strtok(line, '\t'); 
     int itr = 0; 
     while(p != NULL) { 
      if(itr == 0){ 
       strcpy(field1, p); 
       itr++; 
      } 
      else if(itr == 1){ 
       strcpy(field2, p); 
       itr++; 
      } 
      else { 
       strcpy(field3, p); 
       itr = 0; 
      } 
      p = strtok(NULL, '\t'); 
     } 
     printf("This is what read: %s%s%s", field1, field2, field3); 
     fclose(infile_ptr); 
    } 
    return 0; 
} 

錯誤:

$ gcc try2.c 
try2.c: In function ‘main’: 
try2.c:17: warning: passing argument 2 of ‘strtok’ makes pointer from integer without a cast 
try2.c:32: warning: passing argument 2 of ‘strtok’ makes pointer from integer without a cast 

$ ./a.out 
ID seq len 
Segmentation fault: 11 
+0

你'myData'是一個不確定的指針,因此您的代碼調用**未定義行爲**。 – WhozCraig

+0

您在輸入字符串中多次使用'strtok'。 'strtok'將*指針*返回給數據,並且在下一次調用'fgets'時覆蓋'line'。現在,即使'myData'指向有用的東西(如答案中所述),如果更改'line',這些結果將不再有用。 – usr2564301

+0

@Jongware,你是對的。我解決了上述問題,除此之外。我如何從'111 \ txxxxxxxx \ t66 \ n'獲得前兩個元素 – user1140126

回答

2

你永遠不分配(或設置)myData - 它可以指向任何地方!

一眼看上去你想要做的是創建kvstructures(每行一個)的列表列表。每條記錄需要malloc a kvstructure

myData = malloc(sizeof(kvstructure)); 

然後,在填充它後,您需要將其添加到列表中。一個簡單的方法是將一個kvstructure *next成員添加到kvstructure和列表只是一個kvstructure*

相關問題