cfile



Автор Dani задал вопрос в разделе Другие языки и технологии

C++ VS 2010 CFile читать файл! и получил лучший ответ

Ответ от ?????? Зелёный змий ??????[гуру]
CFile F1;
F1. Open( L " text. dat " , CFile : : modeCreate | CFile : : modeReadWrite ) ; какого рожна modeCreate И modeReadWrite? modeRead
TRACE(_T("F1. GetLength ( ) = %d
"), F1. GetLength ( )); Уверен, что GetLength() > 0 ?
theApp. m_informatiоn = new CInformation[ F1. GetLength ( ) ] ;
TRACE(_T("theApp. m_informatiоn = %p
"), theApp. m_informatiоn); Уверен, что theApp. m_informatiоn != NULL ?
F1. Read ( &theApp. m_informatiоn, F1. GetLength ( ) ) ;
F1. Close ( ) ;
m_eListbox. AddString ( LPCTSTR( theApp. m_informatiоn [0 ]. sName ) ); ОШИБКА ТУТ
theApp. m_informatiоn [0 ] А это вообще что за фрукт?
Почему читаешь в theApp. m_informatiоn, а доставать чего то пытаешься из theApp. m_informatiоn[0].sName ?

Ответ от Голый Мужик[гуру]
не используйте указатели, динамическую память и массивы в стиле си там, где можно обойтись без них. используйте контейнеры (в примере ниже - std::vector).
если вы используете модель документ/вид, то следует использовать сериализацию документов mfc и оставить cfile в покое.
sizeof(theApp.m_informatiоn) всегда равно 4 для 32-биных систем и 8 для 64-битных, так что вы пишете в файл чушь.
не следует использовать размер файла для определения количества элементов, сохранённых в нём. кроме того, F1.GetLength() возвращает размер в байтах, а не в элементах - ну ты понел.
не следует вообще использовать двоичную запись составных типов в файл. строки, ссылки, указатели, таблица виртуальных функций, тип - всё это вы не сможете прочитать из файла.
для вашего трэша дам пример, но всё же настоятельно попрошу кардинально пересмотреть способ перзистенции данных.
#include <vector>
using namespace std;
template <class T>
CFile & operator<<(CFile & file, const T & value) {
file.Write(&value, sizeof(value));
return file;
}
template <class T>
CFile & operator<<(CFile & file, const vector<T> & v) {
file << v.size();
for (vector<T>::const_iterator i = v.begin(); i != v.end(); i++) {
file << *i;
}
return file;
}
template<class T>
CFile & operator>>(CFile & file, T & result) {
file.Read(&result, sizeof(T));
return file;
}
template <class T>
CFile & operator>>(CFile & file, vector<T> & result) {
typedef vector<T>::size_type SizeType;

SizeType count;
file >> count;
result.reserve(count);
for (SizeType i = 0; i < count; i++) {
T value;
file >> value;
result.push_back(value);
}
return file;
}
void Save(const CString & path, const vector<CInformation> & v) {
CFile file(path, CFile::modeCreate | CFile::modeWrite);
file << v;
}
void Load(const CString & path, vector<CInformation> & v) {
CFile file(path, CFile::modeRead);
file >> v;
}

Ответ от 3 ответа[гуру]
Привет! Вот подборка тем с похожими вопросами и ответами на Ваш вопрос: C++ VS 2010 CFile читать файл!
 

Ответить на вопрос:

Имя*

E-mail:*

Текст ответа:*
Проверочный код(введите 22):*