Некорректное считывание данных из файла - 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
в файл, после чего закрывает его.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д