![]() |
чтение файла прямого доступа
Приветствую!
Прежде всего хочу сказать, что писать программу за меня не прошу. Просто дайте совет, если вам, конечно, не сложно. Проблема моя состоит в том, что программа не корректно считывает символы, суть далее (Я, конечно, понимаю, что если криво запрограммировано, то и считывать будет криво. Прошу помочь мне найти кривизну кода.) Дабы не кидать всю прогу целиком, тем более, что она ещё и на 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, на будущее оформляй код тегом [code] #
Что если попытаться "вычленить" ошибку методом научного тыка? Т.е. заменить конструкции sizeof на константные значения? Хотя по логике вроде все правильно. printf ("%s ",s.ei); может стоит пока закомментировать? |
Спасибо за внимание, lxa85. И за совет тоже.
Пытался заменять на константу, пытался также закомментировать. В первом случае без изменений, во втором: [текст][текст2][число][число] - казалось бы как и надо, но ведь [текст2] я не выводил. Кроме того ограничения на длину выводимого текста не действуют: printf ("%s ",s.im) выводит то же,что и printf ("%2s ",s.im) При отладке также выяснилось, что если поставить printf ("%s ",s.im) Код:
while(i<l) |
Чисто гипотетический "костыль". Если один раз срабатывает, может в конце или в начале произвести обнуление структуры s?
|
так как
Код:
struct tab{ Хотя... Можно попробовать считать одной сохранить в другую. Спасибо) |
Цитата:
функция printf, получив параметр типа char*, как и любая другая функция работы с "символьным массивом, заканчивающимся нулём", будет обрабатывать текст до тех пор, пока не наткнётся на ноль. Не символ "0", а символ с нулевым кодом (в тексте программы может быть описан лексмой '\0' ) То есть, при работе со строками, как с массивами символов, нужно помнить, что размер массива должен быть на 1 больше максимального размера строки. Потому что каждая строка на самом деле длиннее на один символ. Если две строки, расположенные в оперативной памяти слитно, выводятся как одна, значит ноль в конце первой отсутствует, так как не поместился в первый массив и был затёрт в момент заполнения второго. Увеличь размер массива на 1 или используй специальные строковые объекты (String, AnsiSting и т.д.) |
Время: 03:20. |
Время: 03:20.
© OSzone.net 2001-