Войти

Показать полную графическую версию : [решено] чтение файла прямого доступа


Glorh
26-12-2010, 20:18
Приветствую!

Прежде всего хочу сказать, что писать программу за меня не прошу. Просто дайте совет, если вам, конечно, не сложно.

Проблема моя состоит в том, что программа не корректно считывает символы, суть далее
(Я, конечно, понимаю, что если криво запрограммировано, то и считывать будет криво. Прошу помочь мне найти кривизну кода.)

Дабы не кидать всю прогу целиком, тем более, что она ещё и на 20% не сделана, вот часть, ответственная за считывание:
-----------------------
void fr() //читалка-печаталка
{
int i,l;
i=0;
char str[7];
char str2[7];
fseek(input,0,SEEK_END);
l=ftell(input);
printf("\n%d\n",l);
while(i<l)
{
fseek(input,i,SEEK_SET);
fread(s.im,sizeof(s.im),1,input);
fread(s.ei,sizeof(s.ei),1,input);
fread(str,sizeof(str),1,input);
fread(str2,sizeof(str2),1,input);
printf ("%s ",s.im);
printf ("%s ",s.ei);
s.year=atof(str);
s.year2=atof(str2);
if (i==0) printf("%.0f %.0f\n",s.year,s.year2);
else printf("%.1f %.1f\n",s.year,s.year2);
i+=sizeof(s.im)+sizeof(s.ei)+sizeof(str)+sizeof(str2);
}
}
----------------
а вот и структура, в элементы которой сейвятся значения
----------------
struct tab{
char im[15];
char ei[14];
float year;
float year2;
} s;
----------------
структура считываемого файла
[текст][текст2][число][число]

printf ("%s ",s.im); выводит
[текст]+[текст2], хотя должна [текст]. В чём кривость (ток не надо говорить, что в руках).

С уважением и надеждой на помощь.

Glorh
26-12-2010, 20:53
Прошу прощения за второй пост подряд.

Просто хочу попросить по возможности ответить сегодня, т.к. завтра, увы, уже поздно.)

lxa85
26-12-2010, 20:55
Glorh, на будущее оформляй код тегом [CODE] #
Что если попытаться "вычленить" ошибку методом научного тыка? Т.е. заменить конструкции sizeof на константные значения?
Хотя по логике вроде все правильно.
printf ("%s ",s.ei); может стоит пока закомментировать?

Glorh
26-12-2010, 21:04
Спасибо за внимание, lxa85. И за совет тоже.

Пытался заменять на константу, пытался также закомментировать.
В первом случае без изменений, во втором:
[текст][текст2][число][число] - казалось бы как и надо, но ведь [текст2] я не выводил.

Кроме того ограничения на длину выводимого текста не действуют: printf ("%s ",s.im) выводит то же,что и printf ("%2s ",s.im)

При отладке также выяснилось, что если поставить printf ("%s ",s.im)while(i<l)
{ fseek(input,i,SEEK_SET);
fread(s.im,sizeof(s.im),1,input);
printf ("%s ",s.im);//=вот здесь=
fread(s.ei,sizeof(s.ei),1,input);
fread(str,sizeof(str),1,input);
fread(str2,sizeof(str2),1,input);
//printf ("%s ",s.im);
printf ("%s ",s.ei);
s.year=atof(str);
s.year2=atof(str2);
if (i==0)
printf("%.0f %.0f\n",s.year,s.year2);
else printf("%.1f %.1f\n",s.year,s.year2);
i+=sizeof(s.im)+sizeof(s.ei)+sizeof(str)+sizeof(str2); }
один раз срабатывает нормально, но так как в идеале у меня массив структур - не катит.

lxa85
26-12-2010, 21:14
Чисто гипотетический "костыль". Если один раз срабатывает, может в конце или в начале произвести обнуление структуры s?

Glorh
26-12-2010, 21:19
так как
struct tab{
char im[15];
char ed[14];
float year;
float year2;
} s[10];
это не подходит.
Хотя... Можно попробовать считать одной сохранить в другую. Спасибо)

El Scorpio
29-12-2010, 09:41
printf ("%s ",s.im); выводит
[текст]+[текст2], хотя должна [текст]. В чём кривость (ток не надо говорить, что в руках). »
В типе данных char и функциях, которые обрабатывают указатели на объекты этого типа.

функция printf, получив параметр типа char*, как и любая другая функция работы с "символьным массивом, заканчивающимся нулём", будет обрабатывать текст до тех пор, пока не наткнётся на ноль. Не символ "0", а символ с нулевым кодом (в тексте программы может быть описан лексмой '\0' )
То есть, при работе со строками, как с массивами символов, нужно помнить, что размер массива должен быть на 1 больше максимального размера строки. Потому что каждая строка на самом деле длиннее на один символ.
Если две строки, расположенные в оперативной памяти слитно, выводятся как одна, значит ноль в конце первой отсутствует, так как не поместился в первый массив и был затёрт в момент заполнения второго.
Увеличь размер массива на 1 или используй специальные строковые объекты (String, AnsiSting и т.д.)




© OSzone.net 2001-2012