Чтение онлайн

на главную - закладки

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

Этот двоичный вывод запутан, сложен и уязвим для ошибок. Однако программисты не всегда должны иметь полную свободу выбора формата файла, поэтому иногда они просто вынуждены использовать двоичный ввод-вывод по воле кого-то другого. Кроме того, отказ от символьного представления иногда можно логично обосновать. Типичные примеры — рисунок или звуковой файл, — не имеющие разумного символьного представления: фотография или фрагмент музыкального произведения по своей природе является совокупностью битов.

Символьный ввод-вывод, по умолчанию предусмотренный в библиотеке, не изменяется при переносе программ из одного компьютера в другой, доступен для человеческого понимания и поддерживается любыми средствами набора текстов. Если есть возможность, рекомендуем использовать именно символьный ввод-вывод, а двоичный ввод-вывод применять только в случае крайней необходимости.

11.3.3. Позиционирование в файлах

При малейшей возможности считывайте и записывайте файлы от начала до конца. Это проще всего и открывает меньше возможностей для совершения ошибок. Каждый раз, когда вы понимаете, что пора изменить файл, лучше создайте новый и запишите в него все изменения. Однако, если вы должны поступить иначе, то можно выполнить позиционирование и указать конкретное место для чтения и записи в файле. В принципе в любом файле, открытом для чтения, существует позиция для считывания/ввода (“read/get position”), а в любом файле, открытом для записи, есть позиция для записи/вывода (“write/put position”).

Эти позиции можно использовать следующим образом.

fstream fs(name.c_str); // открыть для ввода и вывода

if (!fs) error("Невозможно открыть файл ",name);

fs.seekg(5); // перенести позицию считывания (буква g означает "get")

// на пять ячеек вперед (шестой символ)

char ch;

fs>>ch; // считать и увеличить номер позиции для считывания

cout << " шестой символ — это " << ch << '(' << int(ch) << ")\n";

fs.seekp(1); // перенести позицию для записи (буква p означает "put")

// на одну ячейку вперед

fs<<'y'; // записать и увеличить позицию для записи

Будьте осторожны: ошибки позиционирования не распознаются. В частности, если вы попытаетесь выйти за пределы файла (используя функцию

seekg
или
seekp
), то последствия могут быть непредсказуемыми и состояние операционной системы изменится.

11.4. Потоки строк

В качестве источника ввода для потока
istream
или цели вывода для потока
ostream
можно использовать объект класса
string
. Поток
istream
, считывающий данные из объекта класса
string
, называется
istringstream
, а поток
ostream
, записывающий символы в объект класса
string
, называется
ostringstream
. Например, поток
istringstream
полезен для извлечения числовых значений из строк.

double str_to_double(string s)

// если это возможно, преобразовывает символы из строки s

// в число с плавающей точкой

{

istringstream is(s); // создаем поток для ввода из строки s

double d;

is >> d;

if (!is) error("Ошибка форматирования типа double: ",s);

return d;

}

double d1 = str_to_double("12.4"); // проверка

double d2 = str_to_double("1.34e–3");

double d3 = str_to_double("twelve point three"); // вызывается

// error

Если попытаться прочитать данные за пределами строки, предназначенной для ввода в поток

istringstream
, то он перейдет в состояние
eof
. Это значит, что для потока
istringstream
можно использовать обычный цикл ввода; поток
istringstream
на самом деле является разновидностью потока
istream
.

Поток

ostringstream
, наоборот, может быть полезен для форматирования вывода в системах, ожидающих аргумента в виде простой строки, например в системах графического пользовательского интерфейса (раздел 16.5). Рассмотрим пример.

void my_code(string label, Temperature temp)

{

// ...

ostringstream os; // поток для составления сообщения

os << setw(8) << label << ": "

<< fixed << setprecision(5) << temp.temp << temp.unit;

someobject.display(Point(100,100), os.str.c_str);

// ...

}

Функция-член

str
класса
ostringstream
возвращает объект класса
string
, составленный операторами вывода, в поток
ostringstream
. Функция
c_str
— это функция-член класса
string
, возвращающая строки в стиле языка C, которые ожидаются интерфейсами многих систем.

Поделиться:
Популярные книги

Мимик нового Мира 10

Северный Лис
9. Мимик!
Фантастика:
юмористическое фэнтези
альтернативная история
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 10

Польская партия

Ланцов Михаил Алексеевич
3. Фрунзе
Фантастика:
попаданцы
альтернативная история
5.25
рейтинг книги
Польская партия

Здравствуй, 1984-й

Иванов Дмитрий
1. Девяностые
Фантастика:
альтернативная история
6.42
рейтинг книги
Здравствуй, 1984-й

Темный Лекарь 3

Токсик Саша
3. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 3

Назад в СССР: 1986 Книга 5

Гаусс Максим
5. Спасти ЧАЭС
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Назад в СССР: 1986 Книга 5

Наследница Драконов

Суббота Светлана
2. Наследница Драконов
Любовные романы:
современные любовные романы
любовно-фантастические романы
6.81
рейтинг книги
Наследница Драконов

Кодекс Охотника. Книга XIII

Винокуров Юрий
13. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XIII

Не кровный Брат

Безрукова Елена
Любовные романы:
эро литература
6.83
рейтинг книги
Не кровный Брат

Ты нас предал

Безрукова Елена
1. Измены. Кантемировы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Ты нас предал

Возвышение Меркурия. Книга 5

Кронос Александр
5. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 5

Последний Паладин. Том 7

Саваровский Роман
7. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 7

Клан

Русич Антон
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Клан

Калибр Личности 1

Голд Джон
1. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Калибр Личности 1

Вторая жизнь майора. Цикл

Сухинин Владимир Александрович
Вторая жизнь майора
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Вторая жизнь майора. Цикл