![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] чтение файла прямого доступа |
|
C/C++ - [решено] чтение файла прямого доступа
|
Новый участник Сообщения: 16 |
Приветствую!
Прежде всего хочу сказать, что писать программу за меня не прошу. Просто дайте совет, если вам, конечно, не сложно. Проблема моя состоит в том, что программа не корректно считывает символы, суть далее (Я, конечно, понимаю, что если криво запрограммировано, то и считывать будет криво. Прошу помочь мне найти кривизну кода.) Дабы не кидать всю прогу целиком, тем более, что она ещё и на 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], хотя должна [текст]. В чём кривость (ток не надо говорить, что в руках). С уважением и надеждой на помощь. |
|
Отправлено: 20:18, 26-12-2010 |
Новый участник Сообщения: 16
|
Профиль | Отправить PM | Цитировать Прошу прощения за второй пост подряд.
Просто хочу попросить по возможности ответить сегодня, т.к. завтра, увы, уже поздно.) |
Отправлено: 20:53, 26-12-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Необычный Сообщения: 4466
|
Профиль | Сайт | Отправить PM | Цитировать Glorh, на будущее оформляй код тегом [code] #
Что если попытаться "вычленить" ошибку методом научного тыка? Т.е. заменить конструкции sizeof на константные значения? Хотя по логике вроде все правильно. printf ("%s ",s.ei); может стоит пока закомментировать? |
------- Отправлено: 20:55, 26-12-2010 | #3 |
Новый участник Сообщения: 16
|
Профиль | Отправить PM | Цитировать Спасибо за внимание, 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); } |
Отправлено: 21:04, 26-12-2010 | #4 |
Необычный Сообщения: 4466
|
Профиль | Сайт | Отправить PM | Цитировать Чисто гипотетический "костыль". Если один раз срабатывает, может в конце или в начале произвести обнуление структуры s?
|
|
------- Отправлено: 21:14, 26-12-2010 | #5 |
Новый участник Сообщения: 16
|
Профиль | Отправить PM | Цитировать |
Отправлено: 21:19, 26-12-2010 | #6 |
ИО Капитана Очевидности Сообщения: 5387
|
Профиль | Отправить PM | Цитировать Цитата Glorh:
функция printf, получив параметр типа char*, как и любая другая функция работы с "символьным массивом, заканчивающимся нулём", будет обрабатывать текст до тех пор, пока не наткнётся на ноль. Не символ "0", а символ с нулевым кодом (в тексте программы может быть описан лексмой '\0' ) То есть, при работе со строками, как с массивами символов, нужно помнить, что размер массива должен быть на 1 больше максимального размера строки. Потому что каждая строка на самом деле длиннее на один символ. Если две строки, расположенные в оперативной памяти слитно, выводятся как одна, значит ноль в конце первой отсутствует, так как не поместился в первый массив и был затёрт в момент заполнения второго. Увеличь размер массива на 1 или используй специальные строковые объекты (String, AnsiSting и т.д.) |
|
------- Отправлено: 09:41, 29-12-2010 | #7 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Построчное чтение файла и запись в другой | acefoster | Скриптовые языки администрирования Windows | 11 | 28-03-2024 08:02 | |
[решено] Построчное чтение файла в Bash | FATruden | Программирование в *nix | 11 | 19-05-2017 00:44 | |
CMD/BAT - [решено] Чтение строки из файла в переменную | Николя | Скриптовые языки администрирования Windows | 42 | 17-01-2010 19:42 | |
[решено] Чтение-запись битого файла | vit777 | Видео и аудио: обработка и кодирование | 3 | 19-12-2007 09:45 | |
Shell. Чтение текстового файла по строкам. | Delphin911 | Общий по Linux | 11 | 07-04-2005 17:58 |
|