我想创建一个二进制文件,打开这个文件,再朝里面写入二进制数据,我应该怎么去做?读取的时候怎么读取呢?例如,我要写入一句话"abaaaa",我将a编码为01,比编码为001,那么我写入二进制文件里面的时候,是不要先计算出字节的值,例如:编码后为0100101010101,是一次存入前8位,还是一位一位的写进文件里?就这个方法我没有尝试。我觉得不太容易把握,所以,希望前辈指点!那么,如果这样的话,为什么在VC下打开文件的时候还要设置一个二进制的参数,不是很没有必要吗?请前辈最好将代码写出来,或者要调用的函数,类,之类的,晚辈是C++菜鸟水平,很多东西都不懂,希望前辈们指点!
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();
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();
我想你们都误会了我的意思了!不是单纯要转化字符串。我举个吧!char buf[]="abc";定义a=01,b=001,000
那么
存储进去文件以后就变成了
01001000所代表的啊四可码了,例如,这个01001000代表数字64+8,也就是说存进去的是72的阿斯可码了,然后解码的时候如果读到72就自动转换成"abc"字符串了。我想问的是,VC里面有没有直接的朝里面按位来写数据的类或函数,
TO maoxianwang(大大㊣BETAⅡ我想赶快结婚那样就可以)
我没有用过CArchive类,如果可以完成这个功能的话,那么能告知使用方法吗?我手上没有MSDN。前辈,如果VC里面没有直接朝里面写入位的东西的话,那么用没有什么能把位读取出来的函数或者对位进行操作的函数,在下真的是菜鸟,这些东西都不懂的!诚心请教!
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字符。
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(
d += t[ i + j ] - '0';这句话是什么意思啊?我研究了几个小时还是没有头绪!
{
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);
但是下面的代码不能实现.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是空串。是不是字符串的比较不能这样比较