【发布时间】:2019-10-23 03:28:51
【问题描述】:
我正在编写从 txt 文件中读取姓名、姓氏和数字并将它们保存到结构中的函数。文件中的变量是这样排列的
姓名 |姓氏 |编号
我的问题是 fscanf 在读取 EOF 之前的最后一个数字时遇到问题。
我的代码:
int load_phonebook_t(const char *filename, struct entry_t* p, int size)
{
int a,i,ilosc=0;
FILE *fp;
if(filename==NULL || p==NULL || size<1)
{
return -1;
}
fp=fopen(filename,"r");
if(fp==NULL)
{
return -2;
}
rewind(fp);
for(i=0;i<size;i++)
{
if(i==size-1)
{
a=fscanf(fp,"%s | %s | %d[^EOF]",(p+i)->name,(p+i)->last_name,&(p+i)->number);
}
else
{
a=fscanf(fp,"%s | %s | %d",(p+i)->name,(p+i)->last_name,&(p+i)->number);
}
if(a==3)
{
ilosc++;
}
}
fclose(fp);
return ilosc;
}
我尝试使用 fscanf(fp,"%s | %s | %d[^EOF]") 但它不起作用。我需要知道如何在 EOF 之前停止阅读或如何正确阅读。
编辑:
我的 .txt 文件的最后几行:
Annette | Bening | 378422705
George | C.Scott | 209747332
Burt | Lancaster | 568016673
Louis | Gossett Jr. | 528057525
【问题讨论】:
-
您的文件是否包含后跟字符
[^EOF]的整数?重新阅读 scanf 系列函数的相应文档,注意格式参数的描述以及它们返回的内容。你不能随便乱扔东西然后期望它起作用。 -
[^EOF]不是E、O或F的任何东西吗?在大多数系统上,EOF 是一个条件而不是一个字符。如果您担心定位,请以块的形式读取数据并编写适当的解析器。scanf是一根拐杖。 -
%d[^EOF]肯定不是你想的那样。如果这个循环只是应该读取size行数,格式化到结构的字段中,报告读取了多少行(假设很快您将针对那些无人看管的%s说明符解决即将发生的缓冲区溢出厄运),然后这样做。这是要解决的问题,而不是如何不读入 EOF。坦率地说,这有XY problem 的香气。 -
@WhozCraig 我可能会描述我非常想要什么,但问题仍然是我无法阅读最后一个数字,我不知道为什么它没有阅读它。我认为这是由于 EOF 而发生的,我试图找到解决方案。
-
Gossett Jr.正在阻止您后续的int阅读。Jr. | 528057525仍在输入流中,因为它之前的空格停止了姓氏提取。实际上,当您阅读它们时,打印结构中的条目会告诉您这一点。
标签: c