Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
Brother
1

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

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

Author24 — интернет-сервис помощи студентам
Задача : сохранить несколько чисел в файле (ну детский сад!) и потом их прочитать...
Грабли начинаются с записи. Хотим писать в двоичном формате (т.е. не 'букивками'
Читаем в 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...)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.11.2007, 22:34
Ответы с готовыми решениями:

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

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

Считать несколько чисел, а потом вывести их в обратном порядке
Не могу разобраться со стеками в Паскале. В качестве примера попытался написать программу, которая...

Как записывать несколько чисел из файла, а потом их обрабатывать?
int u = reader.read(); System.out.println((char)u); Как эти числа переводить не в чар...

1
Alex-T
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>).
03.11.2007, 03:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.11.2007, 03:28
Помогаю со студенческими работами здесь

Как красиво и коротко прочитать несколько чисел с консоли?
Предположим надо как-то считать несколько чисел с консоли, таких что в каждой строке по числу в...

Сохранить элементы матрицы вещественных чисел в текстовом файле
Сохранить элементы матрицы вещественных чисел в текстовом файле с такой структурой: • первая...

*. В файле из вещественных чисел переставить элементы таким образом, чтобы сначала были записаны все положительные, затем все отрицательные, а потом
Помогите с задачей! Видел подобное решение в нижестоящей теме но оно слишком сложное желательно...

Записать массив из консоли в файл, а потом прочитать
Помогите пожалуйста!!!!! Я не могу записать массив из консоли в файл а потом прочитать:((...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru