Brother
|
|
1 | |
Задача : сохранить несколько чисел в файле и потом их прочитать02.11.2007, 22:34. Показов 1973. Ответов 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...) |
02.11.2007, 22:34 | |
Ответы с готовыми решениями:
1
Как сохранить контейнеры STL в файл. И как потом их прочитать из файла Как прочитать несколько байтов в файле с n-го байта по m-й байт ? Считать несколько чисел, а потом вывести их в обратном порядке Как записывать несколько чисел из файла, а потом их обрабатывать? |
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 | |
03.11.2007, 03:28 | |
Помогаю со студенческими работами здесь
2
Как красиво и коротко прочитать несколько чисел с консоли? Сохранить элементы матрицы вещественных чисел в текстовом файле *. В файле из вещественных чисел переставить элементы таким образом, чтобы сначала были записаны все положительные, затем все отрицательные, а потом Записать массив из консоли в файл, а потом прочитать Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |