Программирование C — fscanf () не считывает всю дату, он читает только «1 8 2020» вместо «01 08 2020»

#c #file #date #scanf

#c #файл #Дата #scanf

Вопрос:

Я буду Прогг. Программа simpel C, которая считывает дату рождения и полное имя из файла. я попробую это с потоком ввода-вывода высокого уровня. Но у меня есть одна проблема … я использую 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",amp;month,amp;day,amp;year,amp;name,amp;fname) != -1) // print till EOF
        {
        printf("n DATA: %d %d %d %s %sn",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

С наилучшими пожеланиями 🙂 !!

Ответ №1:

Это не имеет никакого отношения к чтению, но к формату, который вы выводите. Попробуйте:

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

d напечатает целые числа с заполнением нулем шириной 2.

Ответ №2:

Причина, по которой он не показывает 0 в начале данных, заключается в том, что вы сохраняете значение как int . При печати int с %d вы никогда не увидите начальных нулей, потому что 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",amp;month,amp;day,amp;year,amp;name,amp;fname) != -1) // print till EOF
        {
        printf("n DATA: %s %s %s %s %sn",month,day,year,name,fname);
        }
    fclose(fd);
    }//   MAIN END
  

Комментарии:

1. fscanf(fd,"%s %s %s %s %s",amp;month,amp;day,amp;year,amp;name,amp;fname) !=5 имеет больше смысла, так как fscanf() здесь может вернуться 5,4,3,2,1,0 или EOF . fscanf(fd,"%4s %4s %4s s s",amp;month,amp;day,amp;year,amp;name,amp;fname) != 5 еще лучше.

2. Вы можете указать printf() , чтобы включить начальные нули из чисел.