1

我正在学习在 C 中使用 libcurl。首先,我使用一个随机的登录名列表来搜索可能在此处托管的蛋白质序列文件。这些遵循一组格式,其中第一行是可变长度(但不包含我要查询的信息),然后是一系列大写字母,每六十(60)个字符换行一次(我想要下拉的内容,但重新格式化为每行八十 (80) 个字符)。

我在一个函数中有调用本身:

//finds and saves the fastas for each protein (assuming on exists)
void pullFasta (proteinEntry *entry, char matchType, FILE *outFile) {
    //Local variables
    URL_FILE *handle;
    char buffer[2] = "", url[32] = "http://www.uniprot.org/uniprot/", sequence[2] = "";

    //Build full URL
    /*printf ("u:%s\nt:%s\n", url, entry->title); /*This line was used for debugging.*/
    strcat (url, entry->title);
    strcat (url, ".fasta");

    //Open URL
    /*printf ("u:%s\n", url); /*This line was used for debugging.*/
    handle = url_fopen (url, "r");

    //If there is data there
    if (handle != NULL) {
        //Skip the first line as it's got useless info
        do {
            url_fread(buffer, 1, 1, handle);
        } while (buffer[0] != '\n');

        //Grab the fasta data, skipping newline characters
        while (!url_feof (handle)) {
            url_fread(buffer, 1, 1, handle);
            if (buffer[0] != '\n') {
                strcat (sequence, buffer);
            }
        }

        //Print it
        printFastaEntry (entry->title, sequence, matchType, outFile);
    }
    url_fclose (handle);
    return;
}

proteinEntry定义为:

//Entry for fasta formatable data
typedef struct proteinEntry {
    char title[7];
    struct proteinEntry *next;
} proteinEntry;

在这里找到的url_fopenurl_fcloseurl_feofurl_readURL_FILE代码,它们模仿了它们命名的文件函数。

正如您所看到的,我一直在使用 URL 生成器进行一些调试(uniprot URL 对不同的蛋白质遵循相同的格式),我让它正常工作并且可以从站点中提取数据并以正确的格式将其保存到文件中我想要的。我将读取缓冲区设置为 1,因为我想在开始玩东西之前获得一个非常简单但功能强大(如果不优雅)的程序,所以我有一个基础可以返回,因为我学到了。

我已经测试了url_<function>电话,他们没有给出任何错误。因此,我在每一行之后添加了增量printf调用,以准确识别总线错误发生的位置以及发生在return;.

我对总线错误的理解是,这是一个内存访问问题,我试图获取我的程序无法控制的内存。我的困惑来自这样一个事实,即这是在函数中发生returnvoid。没有任何内容被读取、写入或传递来触发内存错误(至少据我所知)。

谁能指出我正确的方向来解决我的错误?

编辑:正如@BLUEPIXY 指出的那样,我有潜力url_fclose (NULL)。正如@deltheil 指出的那样,我有sequence一个静态数组。这也让我注意到我在重复我的错误内存分配url,所以我更新了它,它现在可以工作了。谢谢你的帮助!

4

1 回答 1

3

如果我们看一下 eghttp://www.uniprot.org/uniprot/Q6GZX1.fasta并跳过第一行(就像你一样),我们有:

MNAKYDTDQGVGRMLFLGTIGLAVVVGGLMAYGYYYDGKTPSSGTSFHTASPSFSSRYRY

这是一个 60 个字符的字符串。

当您尝试阅读此序列时:

//Grab the fasta data, skipping newline characters
while (!url_feof (handle)) {
    url_fread(buffer, 1, 1, handle);
    if (buffer[0] != '\n') {
        strcat (sequence, buffer);
    }
}

问题是sequence不可扩展不够大(它是大小为 2 的固定长度数组)。

因此,请确保选择足够大的大小来容纳任何序列,或者实现动态扩展它的能力。

于 2014-08-06T09:57:42.423 回答