Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] чтение файла прямого доступа

Ответить
Настройки темы
C/C++ - [решено] чтение файла прямого доступа

Новый участник


Сообщения: 16
Благодарности: 0

Профиль | Отправить PM | Цитировать


Приветствую!

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

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

Дабы не кидать всю прогу целиком, тем более, что она ещё и на 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
Благодарности: 0

Профиль | Отправить PM | Цитировать


Прошу прощения за второй пост подряд.

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

Отправлено: 20:53, 26-12-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для lxa85

Необычный


Contributor


Сообщения: 4466
Благодарности: 995

Профиль | Сайт | Отправить PM | Цитировать


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

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:55, 26-12-2010 | #3


Новый участник


Сообщения: 16
Благодарности: 0

Профиль | Отправить 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


Аватара для lxa85

Необычный


Contributor


Сообщения: 4466
Благодарности: 995

Профиль | Сайт | Отправить PM | Цитировать


Чисто гипотетический "костыль". Если один раз срабатывает, может в конце или в начале произвести обнуление структуры s?

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 21:14, 26-12-2010 | #5


Новый участник


Сообщения: 16
Благодарности: 0

Профиль | Отправить PM | Цитировать


так как
Код: Выделить весь код
struct tab{
  char im[15];  
  char ed[14]; 
  float year;
  float year2; 
 } s[10];
это не подходит.
Хотя... Можно попробовать считать одной сохранить в другую. Спасибо)

Отправлено: 21:19, 26-12-2010 | #6


ИО Капитана Очевидности


Contributor


Сообщения: 5387
Благодарности: 1105

Профиль | Отправить PM | Цитировать


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

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

-------
Самое совершенное оружие, которым забиты арсеналы богатых и процветающих наций, может легко уничтожить необразованного, больного, бедного и голодного. Но оно не может уничтожить невежество, болезнь, нищету и голод. (Фидель Кастро)

Почему всех осужденных за измену Родине при Сталине реабилитировали при Горбачёве по отсутствию состава преступления? Потому что при Горбачёве измену Родине перестали считать преступлением.

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:41, 29-12-2010 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] чтение файла прямого доступа

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход