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. И собственно как от оного безобразия избавиться?
Всем откликнувшимся буду очень благодарен!
thWrite.open(pszPathReceiver, ios::app|ios::binary);
Цитата: oxotnik333
отрывай в бинарном режиме:
thWrite.open(pszPathReceiver, ios::app|ios::binary);
thWrite.open(pszPathReceiver, ios::app|ios::binary);
Прописал, не помогло.
При добавлении двух файлов и извлечении за тем двух, в первый добавляет один символ, во второй два лишних символа 'я'... Так и не могу понять в чем проблема...
Код:
while(!thRead.eof())
{
ch = thRead.get();
thWrite.put(ch);
}
{
ch = thRead.get();
thWrite.put(ch);
}
например, тут пишется лишний символ. Надо что-то типа
Код:
while(true)
{
ch = thRead.get();
if(thRead.eof()) break;
thWrite.put(ch);
}
{
ch = thRead.get();
if(thRead.eof()) break;
thWrite.put(ch);
}
ничего подобного. сначала проверяется - кончился ли файл. если нет, то читаем символ. всё правильно
Метод eof() не проверяет "кончился ли файл". Этот метод возвращает значение соотв. флага.
А в какой момент флаг будет установлен? В момент, когда будет произведена попытка чтения "за концом файла".
Поэтому Kogrom прав. Сначала пытаемся получить очередной символ, затем проверяем не взвелся ли в результате нашей попытки флаг EOF.
Все ясно, буду знать!=) Всем огромное спасибо!
После первого чтения потока он впорядке, но если вернуться на начало и снова прочесть этот поток, то первыми символами появляются какие-то иегоглифы. Как от них избавиться?
PS: Для возвращения на начало потока использую функцию - seekg:
Код:
Fin.seekg(0, ios_base::beg);