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

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

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

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

02.11.2007, 22:34. Просмотров 1612. Ответов 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++):

Как сохранить контейнеры STL в файл. И как потом их прочитать из файла - C++
В Qt такой контейнер как map&lt;T,T&gt; библиотеки STL заносится в файл занесением в поток &quot;&lt;&lt;map;&quot; , а как это можно сделать в C++ BUILDER6.0...

Как прочитать несколько байтов в файле с n-го байта по m-й байт ? - C++
Как прочитать несколько байтов в файле с n-го байта по m-й байт ?

Можно ли записывать объекты класса string в память, чтоб потом их прочитать? - C++
Создал класс, который содержит много объектов класса string, но что то не так как надо. В debug режиме удаётся прочитать и вывести, но...

Прочитать последовательность и сохранить в векторе - C++
Прочитайте последовательность из потока cin и сохраните в векторе. Обработайте вектор и перевидите символы каждого слова в верхний регистр....

Threads. Задача. Написать программу, которая создаёт несколько потоков поиска простых чисел и записи в .txt - C++
Добрый день. Начал изучать потоки и програмить с помощью C++. Дали задание - Написать программу, которая создаёт несколько потоков поиска...

Сохранить сложный объект в файл и потом загрузить его - C++
Приветствую всех. Имеется примерно такой код: class Array { ............ double* Cols; ........... }

1
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>).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2007, 03:28
Привет! Вот еще темы с ответами:

Сохранить массив в файл а потом считать его из файла - C++
#include &lt;iostream&gt; using namespace std; int main() { setlocale (0,&quot;&quot;); const int str = 10; const int stolb = 10; int...

Как правильно сохранить и потом считать структуру в бинарный файл - C++
Есть структура struct card { int size; char *lear; int *name; }; Эта структура это карты игрока. Заполняем ее данными, у...

Как сохранить\прочитать контейнер в бинарный файл - C++
ostream_iterator&lt;string, char&gt; out(cout, &quot;\n&quot;); set&lt;string&gt; mat; set&lt;string&gt; pat; string temp; cout &lt;&lt; &quot;Input Mat's...

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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