Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с CFile, Чтение/Запись ... Где eof()? 
:(
    Опции темы
Xenon
Дата 8.7.2006, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: нет
Всего: 50



Раньше, так как кодил под дос, считывал и записывал файлы fstream`ом таким образом (album - это мой класс, а albums - массив типа album*):
Код

void manager::write()
{
    ofstream outfile;
    outfile.open(path,ios::binary);
    if (!outfile)
    {
        throw Error(outfile.rdstate());
    }
    else
    {
        for (int j=0;j<n;j++)
        {
            outfile.write((char*)(albums[j]),sizeof(album));
        }
        is_changed=false;
    }
}
///////////////////////////////////////////////////////
///Чтение данных из файла
void manager::read()
{
    ifstream inf;
    inf.open(path,ios::binary);
    if (!inf)
    {
        throw Error(inf.rdstate());
    }
    else
    {
        n=0;
        while (!inf.eof())
        {
            albums[n]=new album;
            inf.read((char*)(albums[n]),sizeof(album));
            if (inf.eof())
            {
                break;
            }
            n++;    
        }
    }
}


Теперь не очень представляю, как это считывается и записывается при помощи CFile ...
По идее что-то типа того ...
Код

    CFile inf;
    CFileException fileException;
    CString path ="b:\\collection.dat";
    inf.Open(path, CFile::modeRead, &fileException);
    n=0;
    albums[n]=new album;
    inf.Read((char*)(albums[n]),sizeof(album));    

Но тут не итерации - я не нашел ничего у CFile, аля eof() у fstream ... Не очень понимаю, как эта штука тогда работает smile Нашел end, но что это такое и что оно означает и что возращает ... 


--------------------
user posted image  
PM MAIL   Вверх
The Thing
Дата 8.7.2006, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 286
Регистрация: 6.9.2004

Репутация: 1
Всего: 3



Нету тута EOF.

MSDN:
Код

Read takes a pointer to a buffer and the number of bytes to read and returns the actual number of bytes that were read. If the required number of bytes could not be read because end-of-file (EOF) is reached, the actual number of bytes read is returned. If any read error occurs, an exception is thrown. Write is similar to Read, but the number of bytes written is not returned. If a write error occurs, including not writing all the bytes specified, an exception is thrown. If you have a valid CFile object, you can read from it or write to it as shown in the following example:

char      szBuffer[256]; 
UINT      nActual = 0; 
CFile myFile;

myFile.Write( szBuffer, sizeof( szBuffer ) ); 
myFile.Seek( 0, CFile::begin );
nActual = myFile.Read( szBuffer, sizeof( szBuffer ) ); 
 

Это сообщение отредактировал(а) The Thing - 8.7.2006, 23:57


--------------------
Правильность работы программы зависит от двух велечин.
В нужном месте должны стоять нолик и еденичка.
PM MAIL   Вверх
Xenon
Дата 8.7.2006, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: нет
Всего: 50



ТО есть, хочешь сказать, что будет так
Код

    CString path ="b:\\collection.dat";
    CFile inf(path, ios::binary);
    n=0;
    while(inf)
    {
        n++;
        albums[n]=new album;
        inf.Read((char*)(albums[n]),sizeof(album));    
    }

Так?
У меня выкидывает ошибку

Добавлено @ 00:00 
The Thing, эм ... а можешь мой код подправить, чтобы яснее стало? smile  

Это сообщение отредактировал(а) XenonSk - 9.7.2006, 12:56


--------------------
user posted image  
PM MAIL   Вверх
Step
Дата 10.7.2006, 02:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 2
Всего: 25



Код

CFile a("t.txt",CFile::modeRead);
char * b;
b=new char[a.GetLength( )];
int readed=a.Read(b,a.GetLength( ));
a.Close();



так тоже должно работать

Код

CFile a("t.txt",CFile::modeRead);
char  b[100];
int r;
while (0<(r=a.Read(b,100)){

//обрабатываем данные по r байт, при последнем проходе r<=100
}


 


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0454 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.