Здравствуйте, Alex007, Вы писали:
A>Была программка, которая прекрасно работала с текстовыми данными
A>текстовые данные отворматированы и шли построчно
A>... и вставляла туда картинку(с определенным текстом), при встрече определенной (##[87]##) последовательности.
A>Все работало прекрасно, пока в этих текстовых данных не появились бинарные данные (избежать нельзя), режим String, естественно стал выдавать бред.
A>кто-нибудь что-нибудь может подсказать?
ИМХО тебе надо читать бинарные данные побайтово до появления символа \n (точнее двух символов \x0d \x0a), считать считанный буффер строкой и реализовать алгоритм поиска подстроки
Была программка, которая прекрасно работала с текстовыми данными
текстовые данные отворматированы и шли построчно
... и вставляла туда картинку(с определенным текстом), при встрече определенной (##[87]##) последовательности.
Все работало прекрасно, пока в этих текстовых данных не появились бинарные данные (избежать нельзя), режим String, естественно стал выдавать бред.
кто-нибудь что-нибудь может подсказать?
CStdioFile Inputfile, Outputfile;
CStdioFile InputfileBin;
CFileException FileExc;
UINT nOpenFlags;
CString m_M1;
char sBin[256]={NULL};
nOpenFlags = CFile::modeRead|CFile::typeBinary|CFile::shareDenyWrite|CFile::shareDenyRead;
if (!InputfileBin.Open(".\\test\\pic1.bin", nOpenFlags, &FileExc)) {
FileExc.ReportError();
return;
}
nOpenFlags = CFile::modeRead|CFile::typeBinary|CFile::shareDenyWrite|CFile::shareDenyRead;
if (!Inputfile.Open(".\\test\\TEXT.txt", nOpenFlags, &FileExc)) {
FileExc.ReportError();
return;
}
nOpenFlags = CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyWrite|CFile::shareDenyRead;
if (!Outputfile.Open(".\\test\\TEXT1.txt", nOpenFlags, &FileExc)) {
FileExc.ReportError();
return;
}
while (Inputfile.ReadString(m_M1))
{
if (m_M1.Find("##[87]##")!=-1)
{
// write pic
while (InputfileBin.Read(sBin,1))
Outputfile.Write(sBin,1);
}else{//if
Outputfile.WriteString(m_M1);
}
Outputfile.WriteString("\n");
}//while
Inputfile.Close();
Outputfile.Close();
InputfileBin.Close();
этот вариан незнаю, что если размер mBuffer попадет на (##[87]##) последовательность?!
CFile Inputfile, Outputfile;
CFile InputfileBin;
CFileException FileExc;
UINT nOpenFlags;
CString m_M1;
char mBuffer[128];
char sBin[256]={NULL};
nOpenFlags = CFile::modeRead|CFile::typeBinary|CFile::shareDenyWrite|CFile::shareDenyRead;
if (!InputfileBin.Open(".\\test\\pic1.bin", nOpenFlags, &FileExc)) {
FileExc.ReportError();
return;
}
nOpenFlags = CFile::modeRead|CFile::typeBinary|CFile::shareDenyWrite|CFile::shareDenyRead;
if (!Inputfile.Open(".\\test\\text.txt", nOpenFlags, &FileExc)) {
FileExc.ReportError();
return;
}
nOpenFlags = CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyWrite|CFile::shareDenyRead;
if (!Outputfile.Open(".\\test\\text1.txt", nOpenFlags, &FileExc)) {
FileExc.ReportError();
return;
}
DWORD dwRead=0;
int n;
//((n=pFile->Read(buf,sizeof(buf)))>0)
while (( n=Inputfile.Read(mBuffer,sizeof(mBuffer)))>0 )
{
dwRead+=n;
AfxMessageBox(mBuffer);
Outputfile.Write(mBuffer,n);
}//while
Inputfile.Close();
Outputfile.Close();
InputfileBin.Close();
mc_List.AddString("End.....");
}
Спасибо огромное что мой бред прочитали

так и пытаюсь сделать
CFile cR;
CFile cW;
char c_buffer[1056]={NULL};
nOpenFlags = CFile::modeRead|CFile::typeBinary|CFile::shareDenyNone;
if (!cR.Open("!txt.tmp", nOpenFlags)) {
AfxMessageBox("Fehler !lpd.tmp");
return -1;
}
nOpenFlags = CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone;
if (!cW.Open("!txt2.tmp", nOpenFlags)) {
AfxMessageBox("Fehler lptPcl.tmp");
return -1;
}
while (cR.Read(mbuf,1)){ //chitau
char *pdest;
char *pPcl1;
strcat(c_buffer,mbuf); //original buffer for writing
pdest = strrchr( c_buffer, '\x0d\x0a' ); //proverka konca stroki
if ( pdest != NULL )
{
cW.Write(c_buffer,strlen(c_buffer));
strcpy(c_buffer,"");
}
} //While
//1) В этом виде при записи теряются 00 в данных
/****************************************************************************
cW.Write(c_buffer, charlen(c_buffer));
strcpy(c_buffer,"");
/****************************************************************************
//тут все ок
/****************************************************************************
cW.Write(c_buffer, 1);
strcpy(c_buffer,"");
/****************************************************************************
как реализовать 1 метод?
Спасибо
Здравствуйте, Alex007, Вы писали:
A>Спасибо огромное что мой бред прочитали
A>так и пытаюсь сделать
...........................
A>//1) В этом виде при записи теряются 00 в данных
A>/****************************************************************************
A> cW.Write(c_buffer, charlen(c_buffer));
A> strcpy(c_buffer,"");
A>/****************************************************************************
Твой вопрос про первый метод относится к этому блоку?
.........................
A>как реализовать 1 метод?
A>Спасибо
опечатка
//1) В этом виде при записи теряются 00 в данных
/****************************************************************************
cW.Write(c_buffer, strlen(c_buffer));
strcpy(c_buffer,"");
/****************************************************************************
Здравствуйте, Romul, Вы писали:
R>Здравствуйте, Alex007, Вы писали:
A>>Спасибо огромное что мой бред прочитали
A>>так и пытаюсь сделать
R>...........................
A>>//1) В этом виде при записи теряются 00 в данных
A>>/****************************************************************************
A>> cW.Write(c_buffer, charlen(c_buffer));
A>> strcpy(c_buffer,"");
A>>/****************************************************************************
R>Твой вопрос про первый метод относится к этому блоку?
R>.........................
A>>как реализовать 1 метод?
A>>Спасибо
Если ты имеешь в виду, что не записывается нуль терминатор строки, то это потому, что strlen возвращает длину без учета нуль терминатора, т.е. надо
strlen(c_buffer)+1
С текстовыми строками все в порядке, а когда проходят бинарные данные, то они портятся,
т.е я собираю данные в c_buffer, потом c_buffer сливаю в файл, и если встречаю
pdest = strrchr( c_buffer, '\x0d\x0a' );
использую strlen(c_buffer)+1) то
if ( pdest != NULL )
{
cW.Write(c_buffer,strlen(c_buffer)+1);
strcpy(c_buffer,"");
}
так тоже портятся
Сделал обработку специально для 00
теперь все ок,
pNull = strrchr( c_buffer, '\x00' );
if ( pNull != NULL ){
cW.Write(c_buffer,sizeof(char));
strcpy(c_buffer,"");
}