C无法在TXT模式下从文件中初始化列表



所以,我的问题很容易,我必须从txt文件中读取一组数据(2个字符串和几个整数)。每个数据由 n字符分开。问题是,我没有实际读取数据,而是我会得到细分错误,而是我的代码:

if(head == NULL){ //if the list is empty I want to read data from the file
    fp=fopen("elementi.txt", "r");
    if(fp==NULL) {printf("File non esistente"); exit(2);} //this is just a dumb error line
    else {
        while(fgets(buffer.info.nome,20,fp)!=NULL){
            nl_eat(buffer.info.nome); //this function eliminate the 'n' from the string just read
        fgets(buffer.info.artista,20,fp);
            nl_eat(buffer.info.artista);
            fscanf(fp, "%d%*c", buffer.info.data_uscita.anno);
            fscanf(fp, "%d%*c", buffer.info.data_uscita.mese);
            fscanf(fp, "%d%*c", buffer.info.data_uscita.giorno);
            fscanf(fp, "%f%*c", buffer.info.prezzo);
            addFine(&head,buffer);  //adds the read element at the end of the list      
        }
        fclose(fp);
    }
}

所以我试图提供更多信息,缓冲区是nodo的类型nodo

typedef struct Data {
int anno;
int mese;
int giorno;
} data;
typedef struct cd {
char nome[25];
char artista [20];
data data_uscita;
float prezzo;
} CD;
struct Nodo{
CD info;
struct Nodo *next;
};
typedef struct Nodo nodo;

我正在尝试编写一个示例,这是完整的代码:www.pastebin.com/hltj8zg4

核心转储可能是因为您传递整数,而不是指向整数到fscanf()函数。或多或少的最小变化是:

nodo buffer;
if (head == NULL)
{
    char const *file = "elementi.txt";
    fp = fopen(file, "r");
    if (fp == NULL)
    {
        fprintf(stderr, "File %s non esistente", file);
        exit(2);
    }
    else
    {
        while (fgets(buffer.info.nome, sizeof(buffer.info.nome), fp) != NULL)
        {
            nl_eat(buffer.info.nome);
            if (fgets(buffer.info.artista, sizeof(buffer.info.artista), fp) == NULL)
                break;
            nl_eat(buffer.info.artista);
            if (fscanf(fp, "%d%*c", &buffer.info.data_uscita.anno) != 1 ||
                fscanf(fp, "%d%*c", &buffer.info.data_uscita.mese) != 1 ||
                fscanf(fp, "%d%*c", &buffer.info.data_uscita.giorno) != 1 ||
                fscanf(fp, "%f%*c", &buffer.info.prezzo) != 1)
                break;
            addFine(&head, buffer); 
        }
        fclose(fp);
    }
}

您是否应该将buffer作为指针传递给addFine

读取后,您具有"抑制"字符。如果线上没有尾随的空白,那将读取新线。但是,您无法计划检测它们是否成功。您可能会做得更好以分配角色,以便测试是否有角色,如果是新线,则可以。如有必要,您可以吞噬字符到线结束。

如果您仍在获得核心转储,那么我们需要更多上下文。问题可能是在addFine()中。帮助调试的一种方法是在阅读时打印出数据。这检查程序是否正在查看您期望看到的数据。

相关内容

  • 没有找到相关文章

最新更新