从文件c代码中读取

时间:2012-09-12 15:24:32

标签: c file strstr

我有以下代码从文件中读取:

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

由于某些原因,url在调用null时为printf - 我该如何解决?我需要一份数据副本。

2 个答案:

答案 0 :(得分:2)

url只是一个指向内存块的指针,它不包含字符串。当您调用free(line)时,您将删除指向的内存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);
    }
}

答案 1 :(得分: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);