Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы при работе с бинарным файлом, В стиле С++ 
V
    Опции темы
vinter
Дата 29.3.2007, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



не уверен, но насколько я знаю, файл который ты открываешь редактировать нельзя, только полная перезапись или добавление в конец.
так что лучше читай его в буфер, потом делай преобразования, а потом уже записывай новую информацию переписывая весь файл.


--------------------
Мой блог
PM MAIL WWW   Вверх
Kuvaldis
Дата 29.3.2007, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

Репутация: 11
Всего: 61



vinter, 
В Страуструпе я нужного не нашел (может есть), а этот пример - из Дейтела "Как программировать на С++" Должен быть рабочий. В этом то и дело :(


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Daevaorn
Дата 29.3.2007, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(vinter @ 29.3.2007,  20:23)
не уверен, но насколько я знаю, файл который ты открываешь редактировать нельзя, только полная перезапись или добавление в конец.
так что лучше читай его в буфер, потом делай преобразования, а потом уже записывай новую информацию переписывая весь файл.

так и есть. хороший совет.
PM MAIL WWW   Вверх
Alexeis
Дата 29.3.2007, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Да легко 
Это делается при помощи функций fopen fseek fread fwrite / все описания есть в любой справке или я вот нашел у дейтла.

Добавлено через 2 минуты и 26 секунд
fseek - устанавливает позицию в файле а fwrite пишет начиная с нее.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Kuvaldis
Дата 29.3.2007, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

Репутация: 11
Всего: 61



Вот так работает:
Код

ofstream    ourCredit(FILENAME, ios::in | ios::out | ios::binary);


(табл. 13.33 у Джосьютиса.)




--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Любитель
Дата 31.3.2007, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Корректней (идеологически) тогда уж std::fstream, а не std::ofstream.


--------------------
PM MAIL ICQ Skype   Вверх
threef
Дата 31.3.2007, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



Daevaorn, 
Цитата

Цитата(vinter @ 29.3.2007,  20:23) 
не уверен, но насколько я знаю, файл который ты открываешь редактировать нельзя, только полная перезапись или добавление в конец.
так что лучше читай его в буфер, потом делай преобразования, а потом уже записывай новую информацию переписывая весь файл. 


так и есть. хороший совет. 


??
Если бы так было, то впору удавиться. Файлы можно и нужно и читать, и писать тут же. Для этого и существует +, ::in | ::out, READWRITE и другие флажки, обозначающие одно и то же: открыт и для записи, и для чтения.
PM MAIL   Вверх
threef
Дата 31.3.2007, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



Kuvaldis, 
вот код с моими комментариями. Если есть желание разбираться детально - пожалуйста.
Код

//---------------------------------------------------------------------------
                        //   ПРЯМОЙ ДОСТУП К ФАЙЛУ //
//---------------------------------------------------------------------------
// ************* я бы не рекомендовал объединять эти библиотеки
// ************* sdtio||conio и потоки С++
#include <iostream>
#include <iomanip>
#include <fstream>
#include <stdlib.h>
#include <conio.h>
//---------------------------------------------------------------------------
using namespace std;
//---------------------------------------------------------------------------
const char FILENAME[] = "clients.dat";
const int  LASTLEN  = 15;
const int  FIRSTLEN = 10;
const int  SIZE = 100;
const int  SHARP = 2;
//---------------------------------------------------------------------------
struct  clientData
{
    int     AcctNum;
    char    lastName[LASTLEN];
    char    firstName[FIRSTLEN];
    float   balance;
};
//---------------------------------------------------------------------------
char ViewMenu();

void CreateNewFile();

void AppendFile();

void ViewFile();

void OutputRecord(const clientData & client);
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
    char  choice;

    while (1)
    {
        choice = ViewMenu();
        switch (choice)
        {
            case '1':  CreateNewFile();
                       break;

            case '2':  AppendFile();
                       break;

            case '3':  ViewFile();
                       break;
                       
           case 0x1B:  return 0;
        }
     }   
}
//---------------------------------------------------------------------------
char ViewMenu()
{
    // ***********************хочешь нормальное меню - ройся в wincon.h
    system("cls");
    cout << "1.   Create blank file" << endl;
    cout << "2.   Append data to file" << endl;
    cout << "3.   View file" << endl;
    cout << "ESC. Quit" << endl;

    char sym = _getch ();// **************cout && getch - moveton !
    
    return sym;
}
//---------------------------------------------------------------------------
void CreateNewFile()
{
    // для прямого доступа лучше юзать ios::binary(default- text)
    ofstream  ourCredit(FILENAME, ios::out);

    if ( ! ourCredit )
    {
        cerr << "Unable to create file" << endl;
        _getch (); //*************** ?
        exit(1);
    }

    clientData  blankClient = { 0, "", "", 0 };

    // создаем файл на SIZE записей
    for (int i = 0; i < SIZE; i++)
    {
        // криво работает блочная запись в текстовом файле ! плывут размеры,
        // теряются значения...
        ourCredit.write( (char*) &blankClient, sizeof(clientData) );
    }

    ourCredit.close();
    cout << "File created successfully" << endl;//***************** :))
    _getch (); //************** ?
    return;
}
//---------------------------------------------------------------------------
void AppendFile()
{
    ofstream    ourCredit(FILENAME, ios::ate);

    if ( ! ourCredit )
    {
        cerr << "Unable to open file" << endl;
        _getch ();
        exit(1);
    }

    clientData  client;

    cout << "Input account (0 to stop)" << endl << "? ";
    cin.clear();  // ************вот и поползло - stream + conio
    cin.sync();
    
    cin >> client.AcctNum;

    while ( (client.AcctNum > 0) &&  (client.AcctNum < SIZE) )
    {
        cout << "Input First name, Last name, balance" << endl;
        cin >> client.firstName >> client.lastName >> client.balance;
         //************************** при позиционировании файлового указателя следует 
         //********************* предварительно запомнить его текущее значение, чтобы затем к нему вернуться.
         //************ а лучше - перегрузить []
        // позиционирование файлового указателя
        ourCredit.seekp( (client.AcctNum - 1) * sizeof(clientData), ios::beg);
        ourCredit.write( (char*) &client, sizeof(clientData) );
        cout << "Input account" << endl << "? ";
        cin >> client.AcctNum; 
    }

 //   ourCredit.seekp( 0, ios::end );   
    ourCredit.close();
    cout << "File updated successfully" << endl;
    _getch ();
    return;
}
//---------------------------------------------------------------------------
void OutputRecord(const clientData & client)
{
    cout.setf(ios::fixed);
    cout.precision(SHARP);

    cout << setw(11) << client.AcctNum <<
            setw(LASTLEN + 5) <<  client.lastName <<
            setw(FIRSTLEN + 5) <<  client.firstName  <<   
            setw(10) << client.balance << endl;
            
    return;        
}
//---------------------------------------------------------------------------
void ViewFile()
{
    ifstream    ourCredit(FILENAME, ios::in);

    system("cls");
    
    if ( ! ourCredit )
    {
        cerr << "Unable to open file" << endl;
        _getch ();
        exit(1);
    }
    // ****************поток открывается сначала, зачем его туда тыкать носом ? 
     ourCredit.seekg(0, ios::beg);
     
     cout << "---------------------------------------------------------" << endl;
     cout << setw(11) << "AcctNum" <<
            setw(LASTLEN + 5) <<  "lastName" <<
            setw(FIRSTLEN + 5) <<  "firstName"  <<
            setw(10) << "balance" << endl;

     cout << "---------------------------------------------------------" << endl;

    clientData  client;

    //******************************еще раз, для текстового потока не характерны операции блочного чтения- записи.
    ourCredit.read( (char*) &client, sizeof(clientData) );

    while ( ! ourCredit.eof() )
    {
        if ( client.AcctNum != 0 )
        {
           OutputRecord(client);
        }
        ourCredit.read( (char*) &client, sizeof(clientData) );
    }

    ourCredit.close();
    _getch ();
    return;
}
//--------------------------------------------------------------------------- 


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




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


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

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