Re: Работа с текстовым файлом который содержит бинарные данн
От: Romul Россия  
Дата: 05.07.04 06:28
Оценка: 2 (1)
Здравствуйте, Alex007, Вы писали:

A>Была программка, которая прекрасно работала с текстовыми данными

A>текстовые данные отворматированы и шли построчно

A>... и вставляла туда картинку(с определенным текстом), при встрече определенной (##[87]##) последовательности.


A>Все работало прекрасно, пока в этих текстовых данных не появились бинарные данные (избежать нельзя), режим String, естественно стал выдавать бред.



A>кто-нибудь что-нибудь может подсказать?


ИМХО тебе надо читать бинарные данные побайтово до появления символа \n (точнее двух символов \x0d \x0a), считать считанный буффер строкой и реализовать алгоритм поиска подстроки
Работа с текстовым файлом который содержит бинарные данные
От: Alex007  
Дата: 02.07.04 12:36
Оценка:
Была программка, которая прекрасно работала с текстовыми данными
текстовые данные отворматированы и шли построчно

... и вставляла туда картинку(с определенным текстом), при встрече определенной (##[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.....");
}
Re: Работа с текстовым файлом который содержит бинарные данн
От: Alex007  
Дата: 06.07.04 09:50
Оценка:
Спасибо огромное что мой бред прочитали
так и пытаюсь сделать



    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 метод?
Спасибо
Re[2]: Работа с текстовым файлом который содержит бинарные д
От: Romul Россия  
Дата: 06.07.04 09:55
Оценка:
Здравствуйте, Alex007, Вы писали:

A>Спасибо огромное что мой бред прочитали

A>так и пытаюсь сделать

...........................

A>//1) В этом виде при записи теряются 00 в данных

A>/****************************************************************************
A> cW.Write(c_buffer, charlen(c_buffer));
A> strcpy(c_buffer,"");
A>/****************************************************************************

Твой вопрос про первый метод относится к этому блоку?

.........................

A>как реализовать 1 метод?

A>Спасибо
Re: Работа с текстовым файлом который содержит бинарные данн
От: Alex007  
Дата: 06.07.04 09:55
Оценка:
опечатка

//1) В этом виде при записи теряются  00 в данных 
/****************************************************************************
                                     cW.Write(c_buffer, strlen(c_buffer));
                    strcpy(c_buffer,"");
/****************************************************************************
Re[2]: Работа с текстовым файлом который содержит бинарные д
От: Alex007  
Дата: 06.07.04 09:57
Оценка:
Да
Re[3]: Работа с текстовым файлом который содержит бинарные д
От: Romul Россия  
Дата: 06.07.04 10:09
Оценка:
Здравствуйте, 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
Re[4]: Работа с текстовым файлом который содержит бинарные д
От: Alex007  
Дата: 06.07.04 10:31
Оценка:
С текстовыми строками все в порядке, а когда проходят бинарные данные, то они портятся,

т.е я собираю данные в 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,"");
               }


так тоже портятся
Re[5]: Работа с текстовым файлом который содержит бинарные д
От: Alex007  
Дата: 06.07.04 11:57
Оценка:
Сделал обработку специально для 00
теперь все ок,



pNull = strrchr( c_buffer, '\x00' );

if ( pNull != NULL ){
                    
cW.Write(c_buffer,sizeof(char));
strcpy(c_buffer,"");
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.