#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()
, чтобы включить начальные нули из чисел.