Массивы, в общем случае, нужно выводить поэлементно в цикле. Единственное исключение из этого правила — символьный массив. Для вывода всего символьного массива достаточно (как в приведенном примере) задать его имя.
Вывод строки символьного массива можно осуществить и методом write(), например:
cout.write(sl, strlen(sl)); cout.write(s2, strlen(s2));
Первым параметром метода write() указывается адрес символьного массива, вторым — количество выводимых символов.
Так как обычно методы вывода возвращают ссылку на поток, можно объединять
их в один оператор, например:
cout. write(sl,strlen(sl)).put('\n').put('\n');
При использовании метода wri te() надо быть очень аккуратным — метод не отслеживает нулевой байт в конце строки, поэтому можно очень легко совершить ошибку, задав неверное количество выводимых символов. Кроме того, метод не работает непосредственно с переменными типа string.
Однако мы все же можем «заставить» его правильно обрабатывать строки типа string, использовав метод c_str() класса string, например:
cout.write(s3.c_str(), strlen(s3.c_str())); cout.write(s3.c_str(), s3.length()); cout.write(s3.c_str(), s3.size());
Метод c_str() возвращает как раз адрес символьного массива, в котором записаны символы строки. Здесь показаны три разных способа задания длины строки — они эквивалентны с точки зрения результата.
Контрольные вопросы
1. Назовите причины, требующие разделения программ на части.
2. Дайте определение термина «единица трансляции»?
3. Чем! отличается файл с исходным текстом от единицы трансляции?
4. Существуют ли в С++ конструкции, позволяющие идентифицировать отдельный модуль?
5. Какие способы сборки программы вы можете назвать?
6. Что такое «объектный модуль»?
7. Как называется программа, которая «собирает» объектные модули в программу?
8. В чем разница между аргументами "файл" и <файл> в директиве #include?
9. Что такое ODR?
10. Объясните, что такое «страж» включения и зачем он нужен.
11. Является ли интерфейс класса его определением?
12. Сколько определений класса может быть в единице трансляции?
13. Сколько определений класса может быть в программе из нескольких файлов?
14. Чем различаются стандартные заголовки <string>, <string.h> и <cstring>?
15. Каковы функции программы «мейкер»?
16. Каким образом глобальную переменную, определенную в одной единице трансляции, сделать доступной в другой единице трансляции? А константу?
17. Можно ли использовать слово extern при объявлении функций?
18. Как локализовать объявление функции в файле?
19. Чем отличается «внешнее» связывание от «внутреннего»?
20. Что такое «спецификации компоновки»?
21. Для каких объектов по умолчанию характерно внутреннее связывание?
22. Какие области видимости имен вы знаете?
23. Для чего используются пространства имен?
24. Чем различаются именованные и неименованные пространства имен?
25. Сколько неименованных пространств имен может быть в программе?
26. Что такое «глобальное пространство имен»?
27. Могут ли пространства имен быть вложенными?
28. Для чего применяются синонимы в пространствах имен?
29. Как сделать члены одного пространства имен доступными в нескольких (в пределе — во всех) файлах программного проекта?
30. Объясните разницу между статической и динамической инициализацией.
31. В чем состоит проблема инициализации глобальных статических переменных?
32. Для чего применяются директивы явного инстанцирования?
33. Объясните, в чем состоят проблемы, возникающие при разделении шаблонного класса на интерфейс и реализацию?
34. Что такое «модель явного инстанцирования» и как она работает?
35. Какие проблемы вызывает внутреннее связывание в шаблонах? |