【问题标题】:Programming C - fscanf () doesn´t read the whole date, it read only "1 8 2020" instead of "01 08 2020"编程 C - fscanf () 不读取整个日期,它只读取“1 8 2020”而不是“01 08 2020”
【发布时间】:2020-12-29 11:38:10
【问题描述】:

我会Progg。从文件中读取生日和全名的简单 C 程序。 我将尝试使用高级 I/O 流。 但是我有一个问题...我使用 fscanf() 来读取文件... 但它不会像这样读取文件的完整日期:

文件: (test.txt)

01 02 1999 name1 nachname1
08 01 2000 name2 nachname2
10 02 2001 name3 nachname3

它只是读到这个:

程序输出:

1 2 1999 name1 nachname1
8 1 2000 name2 nachname2
10 2 2001 name3 nachname3

它不会在日期编号的开头显示0。 请检查我的源代码并告诉我我做错了什么。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
    int main()
    {//   MAIN START
        char name[20],fname[20];
        int day,month,year;
        FILE *fd;
        fd= fopen("test.txt","r");
    // read word by word
    while( fscanf(fd,"%d %d %d %s %s",&month,&day,&year,&name,&fname) != -1) // print till EOF
        {
        printf("\n DATA: %d %d %d %s %s\n",month,day,year,name,fname);
        }
    fclose(fd);
    }//   MAIN END

这又是我的文件 (test.txt):

01 02 1999 name1 nachname1
08 01 2000 name2 nachname2
10 02 2001 name3 nachname3

这里又是编译后程序的输出:

1 2 1999 name1 nachname1
8 1 2000 name2 nachname2
10 2 2001 name3 nachname3

编译器:GCC

操作系统:Linux

最好的问候我:) !!

【问题讨论】:

    标签: c file date scanf


    【解决方案1】:

    它与读取无关,而与您输出的格式有关。试试:

     printf("\n DATA: %02d %02d %04d %s %s\n", month, day, year, name, fname);
    

    %02d 将打印宽度为 2 的零填充整数。

    【讨论】:

      【解决方案2】:

      它没有在数据开头显示 0 的原因是因为您将值存储为 int。当使用%d 打印int 时,您将永远不会看到前导零,因为 0001 = 1。您必须将它们作为字符串读取才能获得前导零,然后使用 atoi 获取实际数字或再次使用 fscanf。

      #include <stdio.h>
      int main()
          {//   MAIN START
              char name[20],fname[20];
              char day[5],month[5],year[5];
              FILE *fd;
              fd= fopen("test.txt","r");
          // read word by word
          while( fscanf(fd,"%s %s %s %s %s",&month,&day,&year,&name,&fname) != -1) // print till EOF
              {
              printf("\n DATA: %s %s %s %s %s\n",month,day,year,name,fname);
              }
          fclose(fd);
          }//   MAIN END
      

      【讨论】:

      • fscanf(fd,"%s %s %s %s %s",&amp;month,&amp;day,&amp;year,&amp;name,&amp;fname) !=5 更有意义,因为这里的fscanf() 可能返回5,4,3,2,1,0EOFfscanf(fd,"%4s %4s %4s %19s %19s",&amp;month,&amp;day,&amp;year,&amp;name,&amp;fname) != 5 更好。
      • 您可以告诉printf() 包括数字中的前导零。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      相关资源
      最近更新 更多