2013-11-21 53 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*

相关问题