Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

С++, файловые потоки

307
03 декабря 2008 года
Artem_3A
863 / / 11.04.2008
Есть код
Код:
const char* fnGetName(char* pszPath)
{
    char* pszResult = new char[MAX_NAME_LEN];
    int iLenPath = 0;
    int iLenName = 0;
    for(iLenPath; pszPath[iLenPath]!=0; iLenPath++){};
    for(int i=0; i<iLenPath; i++)
    {
        iLenName++;
        if(pszPath[iLenPath-i-1]=='\\')
            break;
    }
    int j=0;
    for(int i=iLenPath-iLenName; pszPath!=0; i++)
    {
        pszResult[j] = pszPath;
        j++;
    }
    pszResult[iLenName] = 0;
    return pszResult;
}

int fnAdd(char* pszPathSource, char* pszPathReceiver)
{
    ifstream thRead;
    ofstream thWrite;
    thRead.open(pszPathSource, ios::in);
    thWrite.open(pszPathReceiver, ios::app);
    if(thRead.fail())
        return OPEN_SOURCE_ERROR;
    if(thWrite.fail())
        return OPEN_RECEIVER_ERROR;
    char ch;
    thWrite << SEPARATOR<< fnGetName(pszPathSource)<< '!';
    while(!thRead.eof())
    {
        ch = thRead.get();
        thWrite.put(ch);
    }
    thRead.close();
    thWrite.close();
    return GOOD_COMPLETE;
}

int fnProcessSeparator(ofstream& thWrite, ifstream& thRead)
{
    char* pszBuf = new char[SEPARATOR_LEN-1];
    thRead.getline(pszBuf, SEPARATOR_LEN-1);
    thRead.clear();
    bool flag = true;
    for(int i=1; i<SEPARATOR_LEN; i++)
        if(pszBuf[i-1]!=SEPARATOR)
            flag = false;
    if(flag)
    {
        char ch;
        int i=0;
        char* pszName = new char[MAX_NAME_LEN];
        do
        {
            ch = thRead.get();
            if(ch!='!')
            {
                pszName = ch;
                i++;
            }
        }while(ch!='!');
        pszName = 0;
        if(i<1 || i==MAX_NAME_LEN)
            return OPEN_RECEIVER_ERROR;
        thWrite.close();
        thWrite.open(pszName, ios::out);
        return GOOD_COMPLETE;
    }
    thWrite << '~'<< pszBuf;
    return GOOD_COMPLETE;
}

int fnExtract(char* pszPathSource, char* pszPathLocation)
{
    ifstream thRead;
    ofstream thWrite;
    thRead.open(pszPathSource, ios::in);
    if(thRead.fail())
        return OPEN_SOURCE_ERROR;
    char ch;
    while(!thRead.eof())
    {
        ch = thRead.get();
        if(ch=='~')
        {
            if(fnProcessSeparator(thWrite, thRead)==OPEN_RECEIVER_ERROR)
                return OPEN_RECEIVER_ERROR;
            thWrite.clear();
        }
        else
        {
            thWrite.put(ch);
        }
    }
    thRead.close();
    thWrite.close();
    return GOOD_COMPLETE;
}


Данные код должен склеивать файлы а потом благополучно их разделять, все работает, только при сравнивании файлов после данных операций в каждом файле в конце прибавляется по лишнему символу 'я' в отличие от исходников.
В связи с чем у меня возникает два вопроса:
1. Почему сие безобразие имеет место быть?
2. И собственно как от оного безобразия избавиться?
Всем откликнувшимся буду очень благодарен!
11
03 декабря 2008 года
oxotnik333
2.9K / / 03.08.2007
отрывай в бинарном режиме:
thWrite.open(pszPathReceiver, ios::app|ios::binary);
307
03 декабря 2008 года
Artem_3A
863 / / 11.04.2008
Цитата: oxotnik333
отрывай в бинарном режиме:
thWrite.open(pszPathReceiver, ios::app|ios::binary);



Прописал, не помогло.
При добавлении двух файлов и извлечении за тем двух, в первый добавляет один символ, во второй два лишних символа 'я'... Так и не могу понять в чем проблема...

87
03 декабря 2008 года
Kogrom
2.7K / / 02.02.2008
 
Код:
while(!thRead.eof())
    {
        ch = thRead.get();
        thWrite.put(ch);
    }

например, тут пишется лишний символ. Надо что-то типа
 
Код:
while(true)
    {
        ch = thRead.get();
        if(thRead.eof()) break;
        thWrite.put(ch);
    }
355
03 декабря 2008 года
&lt;SCORP&gt;
786 / / 21.10.2006
ничего подобного. сначала проверяется - кончился ли файл. если нет, то читаем символ. всё правильно
3
03 декабря 2008 года
Green
4.8K / / 20.01.2000
[QUOTE=<SCORP>;268436]ничего подобного. сначала проверяется - кончился ли файл. если нет, то читаем символ. всё правильно[/QUOTE]
Метод eof() не проверяет "кончился ли файл". Этот метод возвращает значение соотв. флага.
А в какой момент флаг будет установлен? В момент, когда будет произведена попытка чтения "за концом файла".

Поэтому Kogrom прав. Сначала пытаемся получить очередной символ, затем проверяем не взвелся ли в результате нашей попытки флаг EOF.
307
04 декабря 2008 года
Artem_3A
863 / / 11.04.2008
Все ясно, буду знать!=) Всем огромное спасибо!
51K
12 января 2010 года
Dr.CODE
18 / / 10.11.2009
А у кого-нибудь была такая штука:
После первого чтения потока он впорядке, но если вернуться на начало и снова прочесть этот поток, то первыми символами появляются какие-то иегоглифы. Как от них избавиться?

PS: Для возвращения на начало потока использую функцию - seekg:
 
Код:
Fin.seekg(0, ios_base::beg);
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог