2012-09-12 71 views
0

我有下面的代码从文件中读取读取:从文件C代码

fin = fopen("file1.txt", "r"); 

char* url; 
if (fin) 
{ 
    while (line = read_line(fin)) 
    { 
     if ((url=strstr(line, "url="))!=NULL) 
     { 
      fprintf(stdout, "%s \n", url); 
      url=line; 
     } 
     free(line); 
    } 
} 

printf("line is:%s ",url); //this one is NULL. How to solve this? 
          // I need A COPY OF THE DATA 
fclose(fin); 

出于某种原因urlnullprintf叫 - 我该如何解决呢?我需要一份数据。

+0

如果你需要一个字符串的副本,一个良好的开端是'strcpy' –

+2

你设置'URL = line;'然后释放'line'。现在url是一个无效的指针。 – jn1kk

+0

'url = line; free(line)'; < - 'url'将指向与'line'相同的地址,所以当你调用'free(line)'时,你也会打断'url'。请问 –

回答

2

url只是一个指向内存块的指针,它不包含字符串。当你打电话给免费(线路)时,你会删除指向的内存网址。

您需要为url分配内存,然后使用strcpy来复制字符串。

还要确保if里面的代码实际上是运行的,否则url指向内存中的一个随机点。

沿着这些线的东西。我不确定strcpy的参数顺序,请在尝试之前查看它。

char* url = 0; 
if (fin) 
{ 
    while (line = read_line(fin)) 
    { 
     char* tmp_url = strstr(line, "url=")); 
     if (tmp_url != NULL) 
     { 
      if(url != 0) free(url); 
      url = (char*)malloc(sizeof(char)*strlen(line)+1); //if you don't know why I'm adding +1 look up null terminated strings 
      fprintf(stdout, "%s \n", url); 
      strcpy(url, line); 
     } 
     free(line); 
    } 
} 
+0

你可以请发布与分配mmeoru和使用strcpy的例子吗? –

+0

我正在c。我有一个错误,说新的不被识别。 –

+0

我需要c代码而不是C++代码。 thx –

0

如果你的read_line函数没有分配内存,它会容易得多。这里有一个建议的修改(未经测试:的xmalloc和xfopen是显而易见的包装上的失败是出口):

char *path = "file1.txt"; 
char* url; 
size_t line_size; 
line = xmalloc(line_size = 128); 
fin = xfopen(path, "r"); 
/* Pass &line so that read_line may realloc if necessary */ 
while(read_line2(fin, &line, &line_size)) { 
     if(url = strstr(line, "url=")) { 
      printf("%s \n", url); 
      url=line; 
     } 
    } 
} 
printf("line is:%s ",url); 
free(line); 
fclose(fin);