【问题标题】:It it possible to to read using fscanf till EOF ? C可以使用 fscanf 读取直到 EOF 吗? C
【发布时间】: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] 不是EOF 的任何东西吗?在大多数系统上,EOF 是一个条件而不是一个字符。如果您担心定位,请以块的形式读取数据并编写适当的解析器。 scanf 是一根拐杖。
  • %d[^EOF] 肯定不是你想的那样。如果这个循环只是应该读取 size 行数,格式化到结构的字段中,报告读取了多少行(假设很快您将针对那些无人看管的 %s 说明符解决即将发生的缓冲区溢出厄运),然后这样做。这是要解决的问题,而不是如何不读入 EOF。坦率地说,这有XY problem 的香气。
  • @WhozCraig 我可能会描述我非常想要什么,但问题仍然是我无法阅读最后一个数字,我不知道为什么它没有阅读它。我认为这是由于 EOF 而发生的,我试图找到解决方案。
  • Gossett Jr. 正在阻止您后续的int 阅读。 Jr. | 528057525 仍在输入流中,因为它之前的空格停止了姓氏提取。实际上,当您阅读它们时,打印结构中的条目会告诉您这一点。

标签: c


【解决方案1】:

使用 scanf 在文件末尾停止很容易。

a=fscanf(fp,"%s | %s | %d",(p+i)->name,(p+i)->last_name,&(p+i)->number);

if (a != 3) {
     /* handle eof; */
     break;
}

还有很多事情要做,涉及格式错误的文件和在增加阵列时读取文件一次,但是嘿,宝贝步骤。您也将在任何 IO 或格式错误时到达该 eof 块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2011-04-15
    • 2020-10-24
    • 2010-09-17
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多