我想创建一个二进制文件,打开这个文件,再朝里面写入二进制数据,我应该怎么去做?读取的时候怎么读取呢?例如,我要写入一句话"abaaaa",我将a编码为01,比编码为001,那么我写入二进制文件里面的时候,是不要先计算出字节的值,例如:编码后为0100101010101,是一次存入前8位,还是一位一位的写进文件里?就这个方法我没有尝试。我觉得不太容易把握,所以,希望前辈指点!那么,如果这样的话,为什么在VC下打开文件的时候还要设置一个二进制的参数,不是很没有必要吗?请前辈最好将代码写出来,或者要调用的函数,类,之类的,晚辈是C++菜鸟水平,很多东西都不懂,希望前辈们指点!

解决方案 »

  1.   

    CArchive类呀别老求JennyVenus他们了,他们也是人呀,也要休息的呀
      

  2.   

    CFile f;
    CFileException e;
    char* pFileName = "d:\\test.txt";
    if( !f.Open( pFileName, CFile::modeCreate | CFile::modeWrite, &e ) )
    {
    #ifdef _DEBUG
    afxDump << "File could not be opened " << e.m_cause << "\n";
    #endif
    return;
    }
    char buf[ 100 ] = "aaabaaa";
    char t[ 100 ] = "";
    size_t i;
    //如果"a"被转化为"01"
    for( i = 0; i < strlen( buf ); i++ )
    {
    if( buf[ i ] == 'a' )
    strcat( t, "01" );
    else if( buf[ i ] == 'b' )
    strcat( t, "001" );
    }
    f.Write( t, strlen( t ) );
    f.Close();
      

  3.   

    CFile f;
    CFileException e;
    char* pFileName = "d:\\test.txt";
    if( !f.Open( pFileName, CFile::modeCreate | CFile::modeWrite, &e ) )
    {
    #ifdef _DEBUG
    afxDump << "File could not be opened " << e.m_cause << "\n";
    #endif
    AfxMessageBox( "open error" );
    return;
    }
    char buf[ 100 ] = "aaaa";
    char t[ 100 ] = "";
    size_t i;
    //如果"a"被转化为01
    for( i = 0; i < strlen( buf ); i++ )
    {
    if( buf[ i ] == 'a' )
    strcat( t, "01" );
    else if( buf[ i ] == 'b' )
    strcat( t, "001" );
    }
    unsigned char d;
    size_t j;
    for( i = 0; i < strlen( t ); i += 8 )
    {
    d = 0;
    for( j = 0; j < 8; j++ )
    {
    d <<= 1;
    d += t[ i * 8 + j ] - '0';
    }
    f.Write( &d, 1 );
    }
    f.Close();
      

  4.   

    不好意思,不好意思!TO EVERYBODY!
    我想你们都误会了我的意思了!不是单纯要转化字符串。我举个吧!char buf[]="abc";定义a=01,b=001,000
    那么
    存储进去文件以后就变成了
    01001000所代表的啊四可码了,例如,这个01001000代表数字64+8,也就是说存进去的是72的阿斯可码了,然后解码的时候如果读到72就自动转换成"abc"字符串了。我想问的是,VC里面有没有直接的朝里面按位来写数据的类或函数,
    TO maoxianwang(大大㊣BETAⅡ我想赶快结婚那样就可以) 
    我没有用过CArchive类,如果可以完成这个功能的话,那么能告知使用方法吗?我手上没有MSDN。前辈,如果VC里面没有直接朝里面写入位的东西的话,那么用没有什么能把位读取出来的函数或者对位进行操作的函数,在下真的是菜鸟,这些东西都不懂的!诚心请教!
      

  5.   

    CFile f;
    CFileException e;
    char* pFileName = "d:\\test.txt";
    if( !f.Open( pFileName, CFile::modeCreate | CFile::modeWrite, &e ) )
    {
    #ifdef _DEBUG
    afxDump << "File could not be opened " << e.m_cause << "\n";
    #endif
    AfxMessageBox( "open error" );
    return;
    }
    char buf[ 100 ] = "abc";
    char t[ 100 ] = "";
    size_t i;
    //如果"a"被转化为01
    for( i = 0; i < strlen( buf ); i++ )
    {
    switch( buf[ i ] )
    {
    case 'a':
    strcat( t, "01" );
    break;
    case 'b':
    strcat( t, "001" );
    break;
    case 'c':
    strcat( t, "000" );
    break;
    default:
    break;
    }
    }
    unsigned char d;
    size_t j;
    for( i = 0; i < strlen( t ); i += 8 )
    {
    d = 0;
    for( j = 0; j < 8; j++ )
    {
    if( t[ i * 8 + j ] && i * 8 + j < 100 )
    {
    d <<= 1;
    d += t[ i * 8 + j ] - '0';
    }
    }
    f.Write( &d, 1 );
    }
    f.Close();
    ----------------------------------------------------
    定义a=01,b=001,000
    那么
    存储进去文件以后就变成了
    01001000所代表的啊四可码了
    -------------->第二个回复和本回复都是针对这个写的,测试结果为H,就是ascii码=72的字符。
    ----------------------------------------------------
    也就是说存进去的是72的阿斯可码了,然后解码的时候如果读到72就自动转换成"abc"字符串了。
    -------------->这样做是绝对解不了码的,因为还有压缩时候的加密问题,"abc"压缩成01001000,那么"cab"呢,就成了00001001了,但是文件自身不能提供是"cab"压缩的信息,读取的时候成了00,001,001就成了一个无法解码的和两个b字符。
      

  6.   

    CFile f;
    CFileException e;
    char* pFileName = "d:\\test.txt";
    if( !f.Open( pFileName, CFile::modeCreate | CFile::modeWrite, &e ) )
    {
    #ifdef _DEBUG
    afxDump << "File could not be opened " << e.m_cause << "\n";
    #endif
    AfxMessageBox( "open error" );
    return;
    }
    char buf[ 100 ] = "abc cba acb bac";
    char t[ 100 ] = "";
    size_t i;
    //如果"a"被转化为01
    for( i = 0; i < strlen( buf ); i++ )
    {
    switch( buf[ i ] )
    {
    case 'a':
    strcat( t, "01" );
    break;
    case 'b':
    strcat( t, "001" );
    break;
    case 'c':
    strcat( t, "000" );
    break;
    default:
    break;
    }
    }
    //AfxMessageBox( t );
    unsigned char d;
    size_t j;
    for( i = 0; i < strlen( t ); i += 8 )
    {
    d = 0;
    for( j = 0; j < 8; j++ )
    {
    if( t[ i + j ] && ( i + j ) < 100 )
    {
    d <<= 1;
    d += t[ i + j ] - '0';
    }
    }
    f.Write( &d, 1 );
    }
    f.Close();
    ---------------
    结果
    HA(
      

  7.   

    TO JennyVenus() SORRY。上面的例子是随便写的,编码的时候,是不能这样编写的,我试试你的方法
      

  8.   

    d <<= 1;
    d += t[ i + j ] - '0';这句话是什么意思啊?我研究了几个小时还是没有头绪!
      

  9.   

    试试这些代码(刚看见这个帖子,用 message 这些太长发不了):void write_bits(FILE* file, int bits, int length = 0/* in bits */)
    {
        static int buffer = 0; // the write buffer 
        static int current_bit = 0; // current bit on writing
        
        if (length == 0) // clear write buffer
        {
            fwrite(&buffer, sizeof(char), (current_bit >> 3) + 1, file);
            current_bit = 0;
        }
        else
        {
            bits &= (1 << length) - 1; // cut down the unnecessary
            
            buffer |= bits << current_bit;
            
            if (current_bit + length < 32)
                current_bit += length; 
            else
            {
                fwrite(&buffer, sizeof(int), 1, file);
                buffer = bits >> (32 - current_bit);
                current_bit += length - 32;
            }
        }
    }int read_bits(FILE* file, int length = 0/* in bits */)
    {
        static int buffer = 0; // the read buffer 
        static int current_bit = 32; // current bit on reading
        
        int bits = 0;
        
        if (length == 0) // clear read buffer
            buffer = current_bit = 0;
        else
        {
            bits = buffer >> current_bit;
            
            if (length + current_bit < 32)
                current_bit += length;
            else
            {
                fread(&buffer, sizeof(int), 1, file);
                bits |= buffer << (32 - current_bit);
                current_bit += length - 32;
            }
            
            bits &= (1 << length) - 1; // cut down the unnecessary
        }
        
        return bits;
    }int bits[8] = { 3, 15, 257, 127, 129, 65537, 65535, 255 };
    int lengths[8] = { 2, 4,  9,   7,   8,   17,    16,    8   };测试代码
    FILE* file = fopen("f:\\test.bin", "w");for (int i = 0; i < 8; i ++)
    {
    write_bits(file, bits[i], lengths[i]);
    }write_bits(file, 0, 0);
    fclose(file);

    file = fopen("f:\\test.bin", "r");
    for (i = 0; i < 8; i ++)
    {
    bits[i] = read_bits(file, lengths[i]);
    }fclose(file);
      

  10.   

    TO  In355Hz(好象一条狗)非常感谢您的代码。在下郁钝,编码写入文件,在读出的时候。我把读出的字符串,用编译原理的方法的判定01,001,0001。
    但是下面的代码不能实现.result是从文件里读出来的字符串,转化为"01001"形式以后的字符串。这些代码是没有错误的。char tempstring[5];
    char result_binary[100]="";
    int j=0;
    for(i=0;i<strlen(result);i++)
    {
    tempstring[j]=result[i];
    if(tempstring[j]=='1')
    {
    tempstring[j+1]='\0';
    if(tempstring=="01")
    strcat(result_binary,"A");
    else if(tempstring=="001")
    strcat(result_binary,"B");
    else if(tempstring=="0001")
    strcat(result_binary,"C");
    cout<<tempstring<<endl;
    j=0;
    } else
    {
    j++;
    }
    }
    cout<<result_binary<<endl;tempstring的输出很正常。但是result_binary是空串。是不是字符串的比较不能这样比较