Некорректное считывание данных из файла - C (СИ)
Формулировка задачи:
заметил ошибку:
из файла считываются настройки, считываются 2 времени, перевожу их в миллисекунды, всё работает, НО! если
время 1 задать как 23:00:00,000
время 2 задать как 23:00:55,000
то время 2 он начинает считать меньше чем 1.
если например задать так:
время 1 задать как 23:00:00,000
время 2 задать как 23:00:10,000
то всё работает нормально....
Fri Dec 17 14:42:24 2010
tim1 = 23:00:00,000 tim2 = 23:00:55,000 dat1 = 15.11.2009 dat2 = 12.09.2010 step = 1000 tim1>tim2 all1=82800000, all2=82789464
hour1=23, min1=0, sec1=0, msec1=0
hour2=23, min2=0, sec2=55, msec2=0
Fri Dec 17 14:42:44 2010
tim1 = 23:00:00,000 tim2 = 23:00:15,000 dat1 = 15.11.2009 dat2 = 12.09.2010 step = 1000 OK
и ещё вопрос. нужно сделать так, чтобы настройки в файле были в рандомной последовательности. я сделал, но с условием, что имя настройки содержит 4 символа.... что совсем не есть хорошо, как сделать грамотней?
/////////////////////////
#include <stdio.h> //nastr.cfg: //
#include <conio.h> //dat1 = 12.12.2010 //
#include <iostream.h> //dat2 = 13.12.2010 //
#include <stdlib.h> //tim1 = 12:15:18,001 //
#include <time.h> //tim2 = 15:12:22,101 //
#include <string.h> //step = 1000 //
/////////////////////////
typedef struct{
int dni;
unsigned long int msec;
char randarr[512];
} REZ_BIN;
int N=5; //kol-vo nastroek v nastr.cfg
int main()
{
FILE *fp;
int day1, month1, year1;
int day2, month2, year2;
int hour1, min1, sec1, msec1;
int hour2, min2, sec2, msec2;
unsigned long int all1, all2;
int step;
FILE *fpLOG;
fpLOG=fopen("../log/log.txt", "ab");
const time_t timer=time(NULL);
fprintf(fpLOG,"\n%s", ctime(&timer));
if((fp=fopen("../etc/nastr.cfg", "r")) == NULL)
{
printf("net faila c nastroikami \n");
fprintf (fpLOG,"net faila c nastroikami \n");
return(1);
}
char nastr[5]; /////N
int z;
for (z=1; z<=N; z++)
{
fscanf(fp, "%4s", &nastr);
int m=0;
if (!strcmp(nastr,"dat1"))
m=1;
if (!strcmp(nastr,"dat2"))
m=2;
if (!strcmp(nastr,"tim1"))
m=3;
if (!strcmp(nastr,"tim2"))
m=4;
if (!strcmp(nastr,"step"))
m=5;
switch (m)
{
case 1:
fscanf(fp, " = %2d.%2d.%4d""\n", &day1, &month1, &year1);
fprintf(fpLOG,"dat1 = %02d.%02d.%04d ", day1, month1, year1);
break;
case 2:
fscanf(fp, " = %2d.%2d.%4d""\n", &day2, &month2, &year2);
fprintf(fpLOG,"dat2 = %02d.%02d.%04d ", day2, month2, year2);
break;
case 3:
fscanf(fp, " = %2d:%2d:%2d,%3d""\n", &hour1, &min1, &sec1, &msec1);
fprintf(fpLOG,"tim1 = %02d:%02d:%02d,%03d ", hour1, min1, sec1, msec1);
break;
case 4:
fscanf(fp, " = %2d:%2d:%2d,%3d""\n", &hour2, &min2, &sec2, &msec2);
fprintf(fpLOG,"tim2 = %02d:%02d:%02d,%03d ", hour2, min2, sec2, msec2);
break;
case 5:
fscanf(fp, " = %d\n", &step);
fprintf(fpLOG,"step = %d ", step);
break;
}//end switch
}//for
//---------------------------------------------------------------------------
int flag=0;
if (day1>31)
{
fprintf(fpLOG,"ne verniy format dat1. (XX.xx.xxxx) ");
printf("ne verniy format dat1. (XX.xx.xxxx)\n");
flag=1;}
if (month1>12)
{
fprintf(fpLOG,"ne verniy format dat1. (xx.XX.xxxx) ");
printf("ne verniy format dat1. (xx.XX.xxxx)\n");
flag=1;}
if (day2>31)
{
fprintf(fpLOG,"ne verniy format dat2. (XX.xx.xxxx) ");
printf("ne verniy format dat2. (XX.xx.xxxx)\n");
flag=1;}
if (month2>12)
{
fprintf(fpLOG,"ne verniy format dat2. (xx.XX.xxxx) ");
printf("ne verniy format dat2. (xx.XX.xxxx)\n");
flag=1;}
if (hour1>23)
{
fprintf(fpLOG,"ne verniy format tim1. (XX:xx:xx,xxx) ");
printf("ne verniy format tim1. (XX:xx:xx,xxx)\n");
flag=1;}
if (min1>59)
{
fprintf(fpLOG,"ne verniy format tim1. (xx:XX:xx,xxx) ");
printf("ne verniy format tim1. (xx:XX:xx,xxx)\n");
flag=1;}
if (sec1>59)
{
fprintf(fpLOG,"ne verniy format tim1. (xx:xx:XX,xxx) ");
printf("ne verniy format tim1. (xx:xx:XX,xxx)\n");
flag=1;}
if (msec1>999)
{
fprintf(fpLOG,"ne verniy format tim1. (xx:xx:xx,XXX) ");
printf("ne verniy format tim1. (xx:xx:xx,XXX)\n");
flag=1;}
if (hour2>23)
{
;
fprintf(fpLOG,"ne verniy format tim2. (XX:xx:xx,xxx) ");
printf("ne verniy format tim2. (XX:xx:xx,xxx)\n");
flag=1;}
if (min2>59)
{
fprintf(fpLOG,"ne verniy format tim2. (xx:XX:xx,xxx) ");
printf("ne verniy format tim2. (xx:XX:xx,xxx)\n");
flag=1;}
if (sec2>59)
{
fprintf(fpLOG,"ne verniy format tim2. (xx:xx:XX,xxx) ");
printf("ne verniy format tim2. (xx:xx:XX,xxx)\n");
flag=1;}
if (msec2>999)
{
fprintf(fpLOG,"ne verniy format tim2. (xx:xx:xx,XXX) ");
printf("ne verniy format tim2. (xx:xx:xx,XXX)\n");
flag=1;}
if (flag==1)
{
return(1);
}
//---------------------------------------------------------------------------
fclose(fp);
all1 = (sec1*1000+min1*60000+hour1*3600000+msec1);
all2 = (sec2*1000+min2*60000+hour2*3600000+msec2);
if (all1>all2)
{
fprintf(fpLOG,"tim1>tim2 ");
fprintf(fpLOG,"all1=%lu, all2=%lu ",all1,all2);
fprintf(fpLOG,"\nhour1=%d, min1=%d, sec1=%d, msec1=%d",hour1,min1,sec1,msec1);
fprintf(fpLOG,"\nhour2=%d, min2=%d, sec2=%d, msec2=%d",hour2,min2,sec2,msec2);
printf("tim1>tim2");
return(1);}
//---------------------------------------------------------------------------Решение задачи: «Некорректное считывание данных из файла»
textual
Листинг программы
fprintf(fpLOG,"all1=%lu, all2=%lu",all1,all2);
Объяснение кода листинга программы
all1иall2- это названия переменных.fpLOG- это дескриптор файла, который используется для записи данных в файл.- Функция
fprintfиспользуется для записи данных в файл. lu- это спецификатор формата, который используется для вывода значений типаunsigned long int.- all1 и all2 - это значения переменных, которые считываются из файла.
- Функция
fprintfпринимает три аргумента: дескриптор файла, строку формата и список аргументов. - В данном случае, строка формата отсутствует, а вместо этого используются спецификаторы формата
lu. - Функция
fprintfзаписывает значения переменныхall1иall2в файл, после чего закрывает его.