Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 05.11.2010
Сообщений: 144

Некорректное считывание данных из файла

17.12.2010, 14:46. Показов 2801. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
заметил ошибку:
из файла считываются настройки, считываются 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




C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
                /////////////////////////
#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);}
//---------------------------------------------------------------------------

и ещё вопрос. нужно сделать так, чтобы настройки в файле были в рандомной последовательности. я сделал, но с условием, что имя настройки содержит 4 символа.... что совсем не есть хорошо, как сделать грамотней?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.12.2010, 14:46
Ответы с готовыми решениями:

Некорректное считывание из файла символов
Здравствуйте, собственно проблема в Некорректном считывании из файла символов, среда code bloks, windows 8.1 rus для одного языка, на win7...

некорректное считывание из файла
ifstream ifst(FNAME_USERLIST); while(!ifst.eof()) { string templog; string temppas; int tempacc; ...

Некорректное считывание из файла
Есть необходимость записывать и считывать в файл и обратно С первым все просто, со вторым казалось бы тоже, но не получается void...

32
1 / 1 / 0
Регистрация: 05.11.2010
Сообщений: 144
23.12.2010, 13:16  [ТС]
Студворк — интернет-сервис помощи студентам
блин, бред... спасибо за ответы.. турбо си.. тоже штоль visual studio ставить..
0
 Аватар для solar_wind
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
23.12.2010, 13:18
deeflash, Разницы быть не должно, в турбо с таких жестких глюков не замечал, возможно либо у тебя не все пересобирается, либо может вирусы что ли .... странно как то
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
23.12.2010, 14:58
С виду может быть проблема с тем, что через fscanf'ы затёр память. Но не исключены и проблемы с компилятором (особенно если это gcc). Для порядку всё-таки скажи, что у тебя за ОС и какой компилятор.

Для проверки можно сделать два экспримента.

1. Переменные all1 и all2 сделай глобальными и повесь на них признак volatile:

C
1
volatile unsigned long all1, all2;
и посмотри, изменится ли что-то

2. Если не изменится, то попробуй сделать короткий пример. Всё, что идёт выше кода

C
1
2
3
4
5
all1 = (sec1*1000+min1*60000+hour1*3600000+msec1);
all2 = (sec2*1000+min2*60000+hour2*3600000+msec2);
 
if (all1>all2)
{
удали. Переменные sec1, min1 и т.п. сделай глобальными и сразу же проинициализируй их нужными значениями.

Добавлено через 1 минуту
Цитата Сообщение от deeflash Посмотреть сообщение
турбо си..
Скажи, чему там равны sizeof(int) и sizeof(long)
1
1 / 1 / 0
Регистрация: 05.11.2010
Сообщений: 144
23.12.2010, 15:31  [ТС]
sizeof(int)= 262146
sizeof(long)=217058568
sizeof(unsigned long)=217713938


Цитата Сообщение от Evg Посмотреть сообщение
1. Переменные all1 и all2 сделай глобальными и повесь на них признак volatile:
ничего не изменилось


Цитата Сообщение от Evg Посмотреть сообщение
2. Если не изменится, то попробуй сделать короткий пример. Всё, что идёт выше кода
Код C
1
2
3
4
5
all1 = (sec1*1000+min1*60000+hour1*3600000+msec 1);
all2 = (sec2*1000+min2*60000+hour2*3600000+msec 2);
if (all1>all2)
{
удали. Переменные sec1, min1 и т.п. сделай глобальными и сразу же проинициализируй их нужными значениями.
удалил код, проинициализировал переменные, ответ такой же как и раньше!

Добавлено через 4 минуты
ОС XP, турбо с 3.0
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
23.12.2010, 16:46
Цитата Сообщение от deeflash Посмотреть сообщение
sizeof(int)= 262146
sizeof(long)=217058568
sizeof(unsigned long)=217713938
Хрень какая-то. Ты что запускал и как проверял?

Цитата Сообщение от deeflash Посмотреть сообщение
удалил код, проинициализировал переменные, ответ такой же как и раньше!
Покажи итоговый короткий пример
1
1 / 1 / 0
Регистрация: 05.11.2010
Сообщений: 144
23.12.2010, 16:56  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Хрень какая-то. Ты что запускал и как проверял?
C
1
printf("sizeof(int)= %lu",sizeof(int));
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#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          //
                            /////////////////////////
 
 
int main()
{
      
 
         int hour1=0, min1=0, sec1=1, msec1=0;
         int hour2=0, min2=0, sec2=42, msec2=0;
         unsigned long int all1, all2;
       
 
 
 
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=%l, all2=%l ",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);}
//---------------------------------------------------------------------------
....
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
23.12.2010, 17:33
По поводу первого напиши всё-таки:

C
1
printf ("%d\n", (int)sizeof(int));
и для long'а

По поводу второго - у тебя переменные day1 и т.п. не инициализированы. К тому же я попросил сделать их глобальными (для подстраховки)
1
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
24.12.2010, 04:41
Цитата Сообщение от deeflash
если так, то printf("%lu" "\n", sizeof(unsigned long int));
там написано как выводить
https://www.cyberforum.ru/post1230587.html
1
1 / 1 / 0
Регистрация: 05.11.2010
Сообщений: 144
24.12.2010, 13:39  [ТС]
если через %lu, то:

sizeof(unsigned long int)=229113860
sizeof(unsigned long)=229113860
sizeof(long)=229113860
sizeof(int)=229113858



если через %d:

sizeof(unsigned long int)=4
sizeof(unsigned long)=4
sizeof(long)=4
sizeof(int)=2


(unsigned long int)sizeof(unsigned long int)=4
(unsigned long)sizeof(unsigned long)=4
(long)sizeof(long)=4
(int)sizeof(int)=2

Цитата Сообщение от Evg Посмотреть сообщение
По поводу второго - у тебя переменные day1 и т.п. не инициализированы. К тому же я попросил сделать их глобальными (для подстраховки)
переменные dey1.. мне щас не нужны, косяк то именно со временем...
глобальными делал, результат тот же..
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.12.2010, 13:47
Цитата Сообщение от deeflash Посмотреть сообщение
(unsigned long int)sizeof(unsigned long int)=4
(unsigned long)sizeof(unsigned long)=4
(long)sizeof(long)=4
(int)sizeof(int)=2
Вот в этом, судя по всему, и проблема. У тебя есть выражения

Цитата Сообщение от deeflash Посмотреть сообщение
all1 = (sec1*1000+min1*60000+hour1*3600000+msec 1);
all2 = (sec2*1000+min2*60000+hour2*3600000+msec 2);
в которых происходят переполнения. Например, hour1*3600000 явно выходит за пределы размера int'а (одна только константа выходит). Проще всего переменные sec1, min1, ... переделать с int'а на long. Можно оставить их int'ами, но выражение переписать как

C
1
all1 = ((unsigned long)sec1*1000UL + (unsigned long)min1*60000UL + (unsigned long)hour1*3600000UL + msec1);
Но такая запись выглядеть будет несколько громоздкой

Добавлено через 1 минуту
К слову говоря, данную проблему тебе обозначили ещё в посте #6. Правда не пояснили, что сие означает, а потому всякая херь типа "sizeof(int)=229113858" у тебя не вызывала никаких подозрений
1
1 / 1 / 0
Регистрация: 05.11.2010
Сообщений: 144
24.12.2010, 13:53  [ТС]
всё заработало.. спасибо. а что значит UL после цифр?
и как я понимаю с этого места: ((unsigned long)sec1*1000UL +.... sec1 дальше уже не инт, а лонг?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.12.2010, 13:58
По умолчанию константы имеют тип int. Чтобы явно сказать компилятору, что они имеют более широкий тип, надо буковку в конце добавлять: L для long, UL для unsigned long, LL для long long, ULL для unsigned long long

Цитата Сообщение от deeflash Посмотреть сообщение
и как я понимаю с этого места: ((unsigned long)sec1*1000UL +.... sec1 дальше уже не инт, а лонг?
Да. Хотя можно было бы все эти преобразования не писать, а оставить только UL у констант. Компилятор в выражении int*long сам преобразует int к long'у. Т.е. можно было бы написать

C
1
all1 = (sec1*1000UL + min1*60000UL + hour1*3600000UL + msec1);
Кстати, наверняка компилятор выдавал предупреждения, но ты их не читал
1
1 / 1 / 0
Регистрация: 05.11.2010
Сообщений: 144
24.12.2010, 14:28  [ТС]
неа, не варнингов, ни ерроров не было, спасибо за помощь..

Добавлено через 18 минут
Цитата Сообщение от vitaly1981 Посмотреть сообщение
Цитата Сообщение от deeflash Посмотреть сообщение
я пытаюсь сделать так, чтобы строки в файле с настройками были не по порядку. я сделал, НО их названия только 4 символа... это не хорошо, и не могу сделать так, чтобы понять, что например одной строки не хватает..
Используй регулярные выражения!
а можно ссылочку где про это почитать на русском?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.12.2010, 14:28
Помогаю со студенческими работами здесь

Некорректное считывание из файла
Есть файл, в него записано число (это длина строка) и сама строка. Запись делается так (это может выполняться многократно): ...

Некорректное считывание данных в R Studio выборки
Всем привет,не знал куда написать, пишу сюда, ибо тема связана с питоном, уже который час сколько перечитал информации, никак не могу...

Запрос данных из файла. Проблема в открывании файла и считывание из него данных
Не понимаю что не так, программа не хочет открывать файл... Пробовал и перемещать его, и использовать другие команды для его вызова... (Щас...

Считывание из текстового файла выборочных данных, сортировка данных по возрастанию и последующая запись в другой файл
Дан файл: 0.3000000E+01 0.1000000E+03 501 1 1 0.00000000E+00 0.00000000E+00 2...

Некорректное считывание байтов
мне необходимо производить операции сложения и вычитания байтов, но столкнулся с проблемой что при чтении некоторых байтов значения выходят...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
[golang] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове. Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
[golang] Breadth-First Search
alhaos 19.05.2026
BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем. . .
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru