所以,我的问题很容易,我必须从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()
中。帮助调试的一种方法是在阅读时打印出数据。这检查程序是否正在查看您期望看到的数据。