Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Brother
Сообщений: n/a
#1

Задача : сохранить несколько чисел в файле и потом их прочитать - C++

02.11.2007, 22:34. Просмотров 1590. Ответов 1
Метки нет (Все метки)

Задача : сохранить несколько чисел в файле (ну детский сад!) и потом их прочитать...
Грабли начинаются с записи. Хотим писать в двоичном формате (т.е. не 'букивками'
Читаем в msdn про конструктор fstream (их несколько, но я цитирую только то, что по теме)
'
fstream( const char* szName, int nMode, int nProt = filebuf::openprot );
[...]
nMode
An integer that contains mode bits defined as ios enumerators that can be combined with the bitwise OR ( | ) operator. The nMode parameter must have one of the following values:
[...]
ios::binary Opens the file in binary mode (the default is text mode).
[...]
'
Рулезь, пишем следующий код :
#include 'stdafx.h'
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
fstream FileStream('data.bin', ios::out | ios::trunc | ios::binary);
int x = 1;
FileStream << x;
return 0;
}
Компилируем (VC6), радуемся, что без ошибок, запущаем... Разочаровываемся... Вместо двоичной записи получаем откровенный ASCII файл длинной в 1 байт, бесстыже хранящий 0x31...
Ладно.. Лезем в msdn, ищем другие пути... Находим статью 'Binary Output Files' где для нас пишут
'
Construct a stream as usual, then use the setmode member function, which changes the mode after the file is opened:
ofstream ofs ( 'test.dat' );
ofs.setmode( filebuf::binary );
ofs.write( char*iarray, 4 ); // Exactly 4 bytes written
'
Ну вааще хорошо! Быренько пишем
#include 'stdafx.h'
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
fstream FileStream('data.bin', ios::out | ios::trunc);
FileStream.setmode(filebuf::binary);
int x = 1;
FileStream << x;
return 0;
}
...при компиляции получаем сообщение об ошибке
error C2039: 'setmode' : is not a member of 'basic_fstream<char,struct std::char_traits<char> >
...то бишь нема такого метода в fstream (который и есть typedef basic_fstream<char,struct std::char_traits<char> >)
хотя в msdn довольно ясно пишуть
'fstream::setmode
int setmode( int nMode = filebuf::text );
Sets the binary/text mode of the stream’s filebuf object. It can be called only after the file is opened.' ...и далее по тексту...
В чем же грабли? 'Пойти мне болото, наесться лягушат?'
(Нет, конечно же нашелся метод решить поставленную задачу заюзанием одновременно в конструкторе ios::binary и записи в файл посредством fstream::write, но все же таки очень интересует вопрос, почему как-то по-левому работает operator<<, не взирая на наше стремление к бинарности, и куда девался setmode из fstream...)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2007, 22:34     Задача : сохранить несколько чисел в файле и потом их прочитать
Посмотрите здесь:

C++ Как правильно сохранить и потом считать структуру в бинарный файл
C++ Сохранить массив в файл а потом считать его из файла
Как прочитать несколько байтов в файле с n-го байта по m-й байт ? C++
C++ Threads. Задача. Написать программу, которая создаёт несколько потоков поиска простых чисел и записи в .txt
C++ В две строчки записать две цифры, а потом по закрытии программы и повторном открытии прочитать каждое число в отдельную переменную?
C++ Можно ли записывать объекты класса string в память, чтоб потом их прочитать?
Как сохранить\прочитать контейнер в бинарный файл C++
C++ Сохранить сложный объект в файл и потом загрузить его
Прочитать несколько секунд wav файла в массив C++
C++ Как прочитать несколько байт из файла с n-го бита
C++ Прочитать последовательность и сохранить в векторе
Запросить у пользователя месяц и год рождения и сохранить их в 2 строки. Потом поменять их местами и вывести C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alex-T
Сообщений: n/a
03.11.2007, 03:28     Задача : сохранить несколько чисел в файле и потом их прочитать #2
Насколько я понимаю, оператор << и stream-ы всякие предназначены для форматного вывода, а если у Вас бинарный вывод, то зачем они Вам - только тормоз лишний, еще уровень надстройки, пользуйтесь буферами.

#include <fstream>
using namespace std;
void main ()
{
basic_filebuf <char> FileBuf;
FileBuf.open ('data.bin', ios::out);
int x = 1;
FileBuf.sputn ((const char *)&x, sizeof (x));
}

ЗЫ. В описание конструктора из MSDN у вас fstream старого стандарта (из <fstream.h>), а все примеры уже приведены на новый, из STL, который, на самом деле basic_fstream (из <fstream>).
Yandex
Объявления
03.11.2007, 03:28     Задача : сохранить несколько чисел в файле и потом их прочитать
Ответ Создать тему
Опции темы

Текущее время: 06:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru