Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 823
от 17.08.2007, 16:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 513, Экспертов: 68
В номере:Вопросов: 4, Ответов: 5


Вопрос № 98070: Здравствуйте. Я уже задавал подобный вопрос (№98025), спасибо ответившим мне. Только вот проблема не решилась: Код программы ниже. Значение тестового фала таково: "nameyear175" Нужно чтобы результаты работы программы были в таком ви...
Вопрос № 98071: Здравствуйте Вывожу на канве текст с помощью TextOutA Как сделать чтобы функция не заполняла фон?...
Вопрос № 98074: Здравствуйте эксперты. Пишу программу, которая бы искала и копировала в указаное место папки, имена которых перечислены в текстовом файле. Не пойму почему не работает функция CopyDir которая должна копировать папку со всем её содержимым. На ...
Вопрос № 98138: Здравствуйте эксперты!Скажите как правильно подключить и использовать файловые потоки (fstream,ofstream,ifstream) в Visual C++ или подскажите где можно об этом почитать. Заранее спасибо!...

Вопрос № 98.070
Здравствуйте. Я уже задавал подобный вопрос (№98025), спасибо ответившим мне. Только вот проблема не решилась:
Код программы ниже. Значение тестового фала таково: "nameyear175"
Нужно чтобы результаты работы программы были в таком виде (1) а не в таком (2).
(1) name
year
123

(2) nameyear123
year123
123

Установка диррективы pragma не помогает. Пожалуйста помогите мне заставить прогу читать корректно структуру с файла именно с использованием функции fread

Приложение:

Отправлен: 11.08.2007, 19:03
Вопрос задал: Nikankin (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Алексей Демаков
Здравствуйте, Nikankin!

Давайте начнем с консерватории :) То есть, с основ языка. На мой взгляд, имеется некоторое недопонимание, которое и приводит к проблемам. Итак:

1. Для размещения строки из N символов в C/C++ требуется предоставить N+1 байт памяти - N для символов и 1 для завершающего нуля. Завершающий нуль требуется для того, чтобы зная указатель на начало строки, определить, где она заканчивается.

2. Поля структуры располагаются в памяти последовательно, но между ними, возможно, есть промежутки - это не задается стандартом, а зависит от конкретного компилятора и указанных опций.

3. pragma - это директива, смысл которой зависит от конкретного компилятора. Поскольку в условии не оговорено, какой компилятор используется, ничего про pragma pack cказать нельзя.

Теперь смотрим:
а). в поля структуры вы пытаетесь записать строки бОльшего размера, чем там есть места - см. (1)
б). Вы пытаетесь прочитать из файла количество байт, равное sizeof(per). Согласно (2), это не обязательно сумма размеров полей. То есть, вашего текстового файла может не хватить для заполнения структуры.
в). В текстовом файле нет завершающих нулевых символов для строк, потому puts проскакивает конец строки, которая находится в поле структуры и переходит к следующему полю и т.п., пока не доберется до нулевого символа (видимо, Вам повезло и после per в памяти находятся нули, а то можно и до памяти, недоступной на чтение добраться). Дело в том, что размер строки для функции puts недоступен - ей передают указатель, который задает только начало строки, конец определяется нулевым символом.

Совет: если хотите научиться программировать хорошо, пытайтесь писать переносимые программы, поведение которых определяется стандартом, а не особенностями конкретного компилятора.

Вывод: поскольку стандарт не определяет расположение полей структуры в памяти, с помощью одного вызова fread читать структуру из файла - ПРИНЦИПИАЛЬНО НЕПРАВИЛЬНО. Это признак плохого стиля и возможный источник труднообнаруживаемых ошибок. Если хотите, можете вызвать fread три раза, для каждого поля структуры в отдельности. Не забудьте увеличить размер полей и проставить нули в конце строк. Тогда все получится.

Ссылка по теме.
Ответ отправил: Алексей Демаков (статус: Студент)
Ответ отправлен: 11.08.2007, 21:23
Оценка за ответ: 5

Отвечает: kool
Здравствуйте, Nikankin!
Все правильно просто выводить
нужно по другому. Вариантов много
вот один из них.
#include
....
main(){
.....
char str[10];
strcpy(str,per.name);
str[sizeof(per.name)]=0;
printf("%s ",str);
strcpy(str,per.year);
str[sizeof(per.year)]=0;
printf("%s ",str);
strcpy(str,per.height);
str[sizeof(per.height)]=0;
printf("%s ",str);
}
Либо в файле после каждого значения поля ставить 0.
Удачи!
---------
I am.
Ответ отправил: kool (статус: Практикант)
Ответ отправлен: 11.08.2007, 21:43
Оценка за ответ: 5


Вопрос № 98.071
Здравствуйте
Вывожу на канве текст с помощью TextOutA
Как сделать чтобы функция не заполняла фон?
Отправлен: 11.08.2007, 19:06
Вопрос задал: Sov (статус: 6-ой класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Jadd
Здравствуйте, Sov!
Попробуйте функцию
int SetBkMode(
HDC hdc, // handle to DC
int iBkMode // background mode
);

iBkMode может быть:
OPAQUE и TRANSPARENT

Ваш вариант - второй. ;)

Удачи.


---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Профессионал)
Адрес: Санкт-Петербург
WWW: http://www.sport-diary.ru
----
Ответ отправлен: 11.08.2007, 21:11
Оценка за ответ: 5
Комментарий оценки:
Спасибо, то что нужно


Вопрос № 98.074
Здравствуйте эксперты.
Пишу программу, которая бы искала и копировала в указаное место папки, имена которых перечислены в текстовом файле.
Не пойму почему не работает функция CopyDir которая должна копировать папку со всем её содержимым. На сколько я понял ошибка в там в пути до копируемой папки, который передается в функцию и заносится в fo.pFrom. Но заносится туда вроде правильный путь, так что не пойму в чем тут дело.. Выдается сообщение что не удается произвести чтение с файла или диска.

Приложение:

Отправлен: 11.08.2007, 19:35
Вопрос задал: Вячеслав Шинкаренко (статус: 2-ой класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Sov
Здравствуйте, Вячеслав Шинкаренко!
Список файлов в fo.pFrom должен завершаться двумя нулями
fo.pFrom ="c:\mdcfo.pTo = "C:\my\";
Ответ отправил: Sov (статус: 6-ой класс)
Ответ отправлен: 11.08.2007, 21:18
Оценка за ответ: 5
Комментарий оценки:
А-а! Понятно!
Спасибо.


Вопрос № 98.138
Здравствуйте эксперты!Скажите как правильно подключить и использовать файловые потоки
(fstream,ofstream,ifstream) в Visual C++ или подскажите где можно об этом почитать.
Заранее спасибо!

Приложение:

Отправлен: 12.08.2007, 14:27
Вопрос задал: Hunter20 (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Терсков Сергей
Здравствуйте, Hunter20!
Подобные вопросы здесь уже не раз задавались. В ответе на вопрос № 97586 я советовал использовать книгу "Николай Джосьютис. Стандартная библиотека С++". Ссылку на электронный вариант можно найти в ответе...
Ответ отправил: Терсков Сергей (статус: Студент)
Ответ отправлен: 13.08.2007, 03:27


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.54 beta от 01.08.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное