示例1:我有string text = "01100001"
然后我想写入文件"a"
示例2:我有string text = "0110000101100010"
所以我想写入文件"ab"
NOTE:
我解决了phase 1
,写作的结果是真的。
例如1:
我想读取文件并将其放入temp 所以temp =“a”,我把它转换为“01100001”
例如2:
我想读取文件并将其放入temp 所以temp =“ab”并将其转换为“0110000101100010”
在我的代码中,我有以下输入
string text ="00000110101011100010001011111110011011110101100101110101101111010111111110101011"
"00111011000011100011100000100010111110111110111001100001110001110000101001111010"
"00000101";
我做了“第1阶段”,我在十六进制编辑器中打开文件,写作是真的 但在做了“第2阶段”temp!= text之后。为什么?
#include <iostream>
#include <sstream>
#include <vector>
#include <fstream>
#include <string>
#include <stdlib.h>
using namespace std;
class bitChar{
public:
unsigned char* c;
int shift_count;
string BITS;
bitChar()
{
shift_count = 0;
c = (unsigned char*)calloc(1, sizeof(char));
}
string readByBits(ifstream& inf)
{
string s ="";
while (inf)
{
string strInput;
getline(inf, strInput );
for (int i =0 ; i < strInput.size() ; i++)
{
s += getBits(strInput[i]);
}
}
return s;
}
void setBITS(string X)
{
BITS = X;
}
int insertBits(ofstream& outf)
{
int total = 0 ;
while(BITS.length())
{
if(BITS[0] == '1')
*c |= 1;
*c <<= 1;
++shift_count;
++total;
BITS.erase(0, 1);
if(shift_count == 7 )
{
if(BITS.size()>0)
{
if(BITS[0] == '1')
*c |= 1;
++total;
BITS.erase(0, 1);
}
writeBits(outf);
shift_count = 0;
free(c);
c = (unsigned char*)calloc(1, sizeof(char));
}
}
if(shift_count > 0)
{
*c <<= (7 - shift_count);
writeBits(outf);
free(c);
c = (unsigned char*)calloc(1, sizeof(char));
}
outf.close();
return total;
}
string getBits(unsigned char X)
{
stringstream itoa;
for(unsigned s = 7; s > 0 ; s--)
{
itoa << ((X >> s) & 1);
}
itoa << (X&1) ;
return itoa.str();
}
void writeBits(ofstream& outf)
{
outf << *c;
}
~bitChar()
{
if(c)
free(c);
}
};
int main()
{
ofstream outf("ssSample.dat",ios::binary);
string text ="00000110101011100010001011111110011011110101100101110101101111010111111110101011"
"00111011000011100011100000100010111110111110111001100001110001110000101001111010"
"00000101";
cout<< text<<endl;
//write to file
bitChar bchar;
bchar.setBITS(text);
bchar.insertBits(outf);
outf.close();
ifstream inf("ssSample.dat" ,ios::binary);
//READ FROM FILE
string temp=bchar.readByBits(inf);
cout << endl;
cout << temp << endl;
return 0;
}
答案 0 :(得分:1)
您有一个LF
换行符。这是被忽略的字符。
0000 1010
这可能不相关,但Windows需要CR
和LF
表示新行。此代码在Windows与Unix中的行为可能不同。
一次读取一个字节。
string readByBits(ifstream& inf)
{
string s ="";
char buffer[1];
while (inf.read (buffer, 1))
{
// string strInput;
//getline(inf, strInput );
//for (int i =0 ; i < strInput.size() ; i++)
//{
s += getBits(*buffer);
//}
}
return s;
}
节目输出:
000001101010111000100010111111100110111101011001011101011011110101111111101010110011101100001110001110000010001011111011111011100110000111000111000010100111101000000101
000001101010111000100010111111100110111101011001011101011011110101111111101010110011101100001110001110000010001011111011111011100110000111000111000010100111101000000101
答案 1 :(得分:0)
您的方法的一个问题是您的文本必须是8位的倍数才能工作。否则,即使一切正确,也会从文件中读取最后一个字符并将其转换为字符串中的8个二进制数字,并添加尾随零。
答案 2 :(得分:0)
我很快发现了两个问题(但我认为还有更多)
您的输入不是 8位的倍数
通过使用getLine,您将阅读,直到遇到分隔字符,从而破坏您的结果,因为您没有处理基于文本的文件