C++ 将字符串写入文件不等于从中读取的字符串 第一阶段
示例1:我有C++ 将字符串写入文件不等于从中读取的字符串 第一阶段,c++,file,binary,binaryfiles,C++,File,Binary,Binaryfiles,示例1:我有string text=“0110001”,然后我想写入文件“a” 示例2:我有string text=“0110000101100010”所以我想写入文件“ab” 注意:我解决了第一阶段,写作结果为真 第二阶段 例1: 我想读取文件并将其置于临时状态。 所以temp=“a”我把它转换成“0110001” 例2: 我想读取文件并将其置于临时状态。 所以temp=“ab”我把它转换成“0110000101100010” 问题: 在我的代码中,我有以下输入 string text
string text=“0110001”
,然后我想写入文件“a”
示例2:我有
string text=“0110000101100010”
所以我想写入文件“ab”
注意:
我解决了第一阶段
,写作结果为真
第二阶段
例1:
我想读取文件并将其置于临时状态。所以temp=“a”我把它转换成“0110001” 例2: 我想读取文件并将其置于临时状态。
所以temp=“ab”我把它转换成“0110000101100010” 问题: 在我的代码中,我有以下输入
string text ="00000110101011100010001011111110011011110101100101110101101111010111111110101011"
"00111011000011100011100000100010111110111110111001100001110001110000101001111010"
"00000101";
我完成了“第1阶段”,并在十六进制编辑器中打开了该文件。书写正确。但在完成“第2阶段”后,温度!=文本。为什么? 我的代码
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
类位字符{
公众:
无符号字符*c;
整数移位计数;
字符串位;
比特字符()
{
移位计数=0;
c=(无符号字符*)calloc(1,sizeof(字符));
}
字符串读取位(ifstream&inf)
{
字符串s=“”;
while(inf)
{
弦纹;
getline(inf,strInput);
对于(int i=0;i itoa您的方法的一个问题是,您的文本必须是8位的倍数才能工作。否则,即使一切都正确,最后一个字符也将从文件中读取,并转换为字符串中的8位二进制数字加上尾随的零。我很快发现了两个问题(但我假设还有更多问题)
您的输入不是8位的倍数
通过使用getLine,您一直在阅读,直到遇到一个定界字符,从而破坏了结果,因为您没有处理基于文本的文件
您有一个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;
}
用a缩小你的问题范围。你可能有阅读问题,或者算术问题,我不会帮你弄清楚是哪一个问题!@Lightness Races in Orbits谢谢。我编辑了这个问题。好的,我知道不是8位的倍数,我已经处理了。好的,我知道不是8位的倍数,我已经处理了。我知道了hink number 2在我的情况下不是问题。如果我是错的,请解释bigerSethB答案正是我的第2点:您以文本形式阅读您以二进制形式编写的内容,因此您丢失了一些数据,因为文本忽略了行控制字符。明白吗?
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