Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将字符串写入文件不等于从中读取的字符串 第一阶段_C++_File_Binary_Binaryfiles - Fatal编程技术网

C++ 将字符串写入文件不等于从中读取的字符串 第一阶段

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

示例1:我有
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;iitoa您的方法的一个问题是,您的文本必须是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